|
8 | 8 | from aleph.types.db_session import DbSession |
9 | 9 | from aleph.types.files import FileTag, FileType |
10 | 10 | from aleph.types.sort_order import SortOrder |
| 11 | +from aleph.utils import make_file_tag |
11 | 12 |
|
12 | 13 | from ..models.files import ( |
13 | 14 | ContentFilePinDb, |
@@ -112,36 +113,90 @@ def insert_grace_period_file_pin( |
112 | 113 | file_hash: str, |
113 | 114 | created: dt.datetime, |
114 | 115 | delete_by: dt.datetime, |
| 116 | + item_hash: Optional[str] = None, |
| 117 | + owner: Optional[str] = None, |
| 118 | + ref: Optional[str] = None, |
115 | 119 | ) -> None: |
116 | 120 | insert_stmt = insert(GracePeriodFilePinDb).values( |
| 121 | + item_hash=item_hash, |
117 | 122 | file_hash=file_hash, |
| 123 | + owner=owner, |
| 124 | + ref=ref, |
118 | 125 | created=created, |
119 | 126 | type=FilePinType.GRACE_PERIOD, |
120 | 127 | delete_by=delete_by, |
121 | 128 | ) |
122 | 129 | session.execute(insert_stmt) |
123 | 130 |
|
124 | 131 |
|
125 | | -def upsert_grace_period_file_pin( |
| 132 | +# TODO: Improve performance |
| 133 | +def update_file_pin_grace_period( |
126 | 134 | session: DbSession, |
127 | | - file_hash: str, |
128 | | - created: dt.datetime, |
| 135 | + item_hash: str, |
129 | 136 | delete_by: Union[dt.datetime, None], |
130 | 137 | ) -> None: |
131 | | - insert_stmt = insert(GracePeriodFilePinDb).values( |
132 | | - file_hash=file_hash, |
133 | | - created=created, |
134 | | - type=FilePinType.GRACE_PERIOD, |
135 | | - delete_by=delete_by, |
136 | | - ) |
137 | | - upsert_stmt = insert_stmt.on_conflict_do_update( |
138 | | - constraint="file_pins_item_hash_type_key", |
139 | | - set_={ |
140 | | - "created": created, |
141 | | - "delete_by": delete_by, |
142 | | - }, |
| 138 | + if delete_by is None: |
| 139 | + delete_stmt = ( |
| 140 | + delete(GracePeriodFilePinDb) |
| 141 | + .where(GracePeriodFilePinDb.item_hash == item_hash) |
| 142 | + .returning( |
| 143 | + GracePeriodFilePinDb.file_hash, |
| 144 | + GracePeriodFilePinDb.owner, |
| 145 | + GracePeriodFilePinDb.ref, |
| 146 | + GracePeriodFilePinDb.created, |
| 147 | + ) |
| 148 | + ) |
| 149 | + |
| 150 | + grace_period = session.execute(delete_stmt).first() |
| 151 | + if grace_period is None: |
| 152 | + return |
| 153 | + |
| 154 | + file_hash, owner, ref, created = grace_period |
| 155 | + |
| 156 | + insert_message_file_pin( |
| 157 | + session=session, |
| 158 | + item_hash=item_hash, |
| 159 | + file_hash=file_hash, |
| 160 | + owner=owner, |
| 161 | + ref=ref, |
| 162 | + created=created, |
| 163 | + ) |
| 164 | + else: |
| 165 | + delete_stmt = ( |
| 166 | + delete(MessageFilePinDb) |
| 167 | + .where(MessageFilePinDb.item_hash == item_hash) |
| 168 | + .returning( |
| 169 | + MessageFilePinDb.file_hash, |
| 170 | + MessageFilePinDb.owner, |
| 171 | + MessageFilePinDb.ref, |
| 172 | + MessageFilePinDb.created, |
| 173 | + ) |
| 174 | + ) |
| 175 | + |
| 176 | + message_pin = session.execute(delete_stmt).first() |
| 177 | + if message_pin is None: |
| 178 | + return |
| 179 | + |
| 180 | + file_hash, owner, ref, created = message_pin |
| 181 | + |
| 182 | + insert_grace_period_file_pin( |
| 183 | + session=session, |
| 184 | + item_hash=item_hash, |
| 185 | + file_hash=file_hash, |
| 186 | + owner=owner, |
| 187 | + ref=ref, |
| 188 | + created=created, |
| 189 | + delete_by=delete_by, |
| 190 | + ) |
| 191 | + |
| 192 | + refresh_file_tag( |
| 193 | + session=session, |
| 194 | + tag=make_file_tag( |
| 195 | + owner=owner, |
| 196 | + ref=ref, |
| 197 | + item_hash=item_hash, |
| 198 | + ), |
143 | 199 | ) |
144 | | - session.execute(upsert_stmt) |
145 | 200 |
|
146 | 201 |
|
147 | 202 | def delete_grace_period_file_pins(session: DbSession, datetime: dt.datetime) -> None: |
@@ -235,6 +290,10 @@ def get_file_tag(session: DbSession, tag: FileTag) -> Optional[FileTagDb]: |
235 | 290 | return session.execute(select_stmt).scalar() |
236 | 291 |
|
237 | 292 |
|
| 293 | +def file_pin_exists(session: DbSession, item_hash: str) -> bool: |
| 294 | + return FilePinDb.exists(session=session, where=FilePinDb.item_hash == item_hash) |
| 295 | + |
| 296 | + |
238 | 297 | def file_tag_exists(session: DbSession, tag: FileTag) -> bool: |
239 | 298 | return FileTagDb.exists(session=session, where=FileTagDb.tag == tag) |
240 | 299 |
|
|
0 commit comments