diff --git a/ts/services/storageRecordOps.ts b/ts/services/storageRecordOps.ts index bcaad6ff1..b41f2952f 100644 --- a/ts/services/storageRecordOps.ts +++ b/ts/services/storageRecordOps.ts @@ -1305,12 +1305,14 @@ export async function mergeStoryDistributionListRecord( details.push('adding unknown fields'); } + const deletedAtTimestamp = getTimestampFromLong( + storyDistributionListRecord.deletedAtTimestamp + ); + const storyDistribution: StoryDistributionWithMembersType = { id: listId, name: String(storyDistributionListRecord.name), - deletedAtTimestamp: isMyStories - ? undefined - : getTimestampFromLong(storyDistributionListRecord.deletedAtTimestamp), + deletedAtTimestamp: isMyStories ? undefined : deletedAtTimestamp, allowsReplies: Boolean(storyDistributionListRecord.allowsReplies), isBlockList: Boolean(storyDistributionListRecord.isBlockList), members: remoteListMembers, @@ -1352,6 +1354,14 @@ export async function mergeStoryDistributionListRecord( details.push('clearing unknown fields'); } + const isBadRemoteData = !deletedAtTimestamp && !storyDistribution.name; + if (isBadRemoteData) { + Object.assign(storyDistribution, { + name: localStoryDistributionList.name, + members: localStoryDistributionList.members, + }); + } + const { hasConflict, details: conflictDetails } = doRecordsConflict( toStoryDistributionListRecord(storyDistribution), storyDistributionListRecord diff --git a/ts/sql/Client.ts b/ts/sql/Client.ts index 8744b58aa..9f164c955 100644 --- a/ts/sql/Client.ts +++ b/ts/sql/Client.ts @@ -1746,6 +1746,10 @@ async function _deleteAllStoryDistributions(): Promise { async function createNewStoryDistribution( distribution: StoryDistributionWithMembersType ): Promise { + strictAssert( + distribution.name, + 'Distribution list does not have a valid name' + ); await channels.createNewStoryDistribution(distribution); } async function getAllStoryDistributionsWithMembers(): Promise< @@ -1761,6 +1765,17 @@ async function getStoryDistributionWithMembers( async function modifyStoryDistribution( distribution: StoryDistributionType ): Promise { + if (distribution.deletedAtTimestamp) { + strictAssert( + !distribution.name, + 'Attempt to delete distribution list but still has a name' + ); + } else { + strictAssert( + distribution.name, + 'Cannot clear distribution list name without deletedAtTimestamp set' + ); + } await channels.modifyStoryDistribution(distribution); } async function modifyStoryDistributionMembers( @@ -1779,6 +1794,17 @@ async function modifyStoryDistributionWithMembers( toRemove: Array; } ): Promise { + if (distribution.deletedAtTimestamp) { + strictAssert( + !distribution.name, + 'Attempt to delete distribution list but still has a name' + ); + } else { + strictAssert( + distribution.name, + 'Cannot clear distribution list name without deletedAtTimestamp set' + ); + } await channels.modifyStoryDistributionWithMembers(distribution, options); } async function deleteStoryDistribution(id: UUIDStringType): Promise {