mirror of
https://git.anonymousland.org/anonymousland/synapse.git
synced 2025-07-22 12:00:41 -04:00
Add an admin api to delete local media. (#8519)
Related to: #6459, #3479 Add `DELETE /_synapse/admin/v1/media/<server_name>/<media_id>` to delete a single file from server.
This commit is contained in:
parent
f6a3859a73
commit
49d72dea2a
7 changed files with 868 additions and 3 deletions
|
@ -93,6 +93,7 @@ class MediaRepositoryStore(MediaRepositoryBackgroundUpdateStore):
|
|||
|
||||
def __init__(self, database: DatabasePool, db_conn, hs):
|
||||
super().__init__(database, db_conn, hs)
|
||||
self.server_name = hs.hostname
|
||||
|
||||
async def get_local_media(self, media_id: str) -> Optional[Dict[str, Any]]:
|
||||
"""Get the metadata for a local piece of media
|
||||
|
@ -115,6 +116,58 @@ class MediaRepositoryStore(MediaRepositoryBackgroundUpdateStore):
|
|||
desc="get_local_media",
|
||||
)
|
||||
|
||||
async def get_local_media_before(
|
||||
self, before_ts: int, size_gt: int, keep_profiles: bool,
|
||||
) -> Optional[List[str]]:
|
||||
|
||||
# to find files that have never been accessed (last_access_ts IS NULL)
|
||||
# compare with `created_ts`
|
||||
sql = """
|
||||
SELECT media_id
|
||||
FROM local_media_repository AS lmr
|
||||
WHERE
|
||||
( last_access_ts < ?
|
||||
OR ( created_ts < ? AND last_access_ts IS NULL ) )
|
||||
AND media_length > ?
|
||||
"""
|
||||
|
||||
if keep_profiles:
|
||||
sql_keep = """
|
||||
AND (
|
||||
NOT EXISTS
|
||||
(SELECT 1
|
||||
FROM profiles
|
||||
WHERE profiles.avatar_url = '{media_prefix}' || lmr.media_id)
|
||||
AND NOT EXISTS
|
||||
(SELECT 1
|
||||
FROM groups
|
||||
WHERE groups.avatar_url = '{media_prefix}' || lmr.media_id)
|
||||
AND NOT EXISTS
|
||||
(SELECT 1
|
||||
FROM room_memberships
|
||||
WHERE room_memberships.avatar_url = '{media_prefix}' || lmr.media_id)
|
||||
AND NOT EXISTS
|
||||
(SELECT 1
|
||||
FROM user_directory
|
||||
WHERE user_directory.avatar_url = '{media_prefix}' || lmr.media_id)
|
||||
AND NOT EXISTS
|
||||
(SELECT 1
|
||||
FROM room_stats_state
|
||||
WHERE room_stats_state.avatar = '{media_prefix}' || lmr.media_id)
|
||||
)
|
||||
""".format(
|
||||
media_prefix="mxc://%s/" % (self.server_name,),
|
||||
)
|
||||
sql += sql_keep
|
||||
|
||||
def _get_local_media_before_txn(txn):
|
||||
txn.execute(sql, (before_ts, before_ts, size_gt))
|
||||
return [row[0] for row in txn]
|
||||
|
||||
return await self.db_pool.runInteraction(
|
||||
"get_local_media_before", _get_local_media_before_txn
|
||||
)
|
||||
|
||||
async def store_local_media(
|
||||
self,
|
||||
media_id,
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue