diff --git a/api/so/sprk/actor/getPreferences.ts b/api/so/sprk/actor/getPreferences.ts index da880be..cfaecd6 100644 --- a/api/so/sprk/actor/getPreferences.ts +++ b/api/so/sprk/actor/getPreferences.ts @@ -42,7 +42,9 @@ export default function (server: Server, ctx: AppContext) { for (const pref of userPref.contentLabelPrefs) { preferences.push({ $type: "so.sprk.actor.defs#contentLabelPref", - labelerDid: pref.labelerDid as DidString | undefined, + ...(pref.labelerDid === undefined + ? {} + : { labelerDid: pref.labelerDid as DidString }), label: pref.label, visibility: pref.visibility as ContentLabelPref["visibility"], }); diff --git a/api/so/sprk/actor/putPreferences.ts b/api/so/sprk/actor/putPreferences.ts index b1dfb90..478cc9b 100644 --- a/api/so/sprk/actor/putPreferences.ts +++ b/api/so/sprk/actor/putPreferences.ts @@ -50,7 +50,9 @@ export default function (server: Server, ctx: AppContext) { case "so.sprk.actor.defs#contentLabelPref": { const p = pref as ContentLabelPref; contentLabelPrefs.push({ - labelerDid: p.labelerDid, + ...(p.labelerDid === undefined + ? {} + : { labelerDid: p.labelerDid }), label: p.label, visibility: p.visibility, }); diff --git a/tests/preferences_test.ts b/tests/preferences_test.ts index b1af3dd..050098c 100644 --- a/tests/preferences_test.ts +++ b/tests/preferences_test.ts @@ -18,7 +18,10 @@ interface PutPreferencesArgs { body: { preferences: Array<{ $type: string; - enabled: boolean; + enabled?: boolean; + labelerDid?: string; + label?: string; + visibility?: string; }>; }; }; @@ -115,3 +118,77 @@ Deno.test("Spark adult content preference round-trips when disabled", async () = enabled: false, }]); }); + +Deno.test("global content label preference omits labelerDid", async () => { + const userDid = "did:plc:testuser"; + let storedPreferences: Partial = {}; + + const ctx = { + authVerifier: { + standard: {}, + }, + dataplane: { + preferences: { + putPreferences: ( + did: string, + preferences: Partial, + ) => { + assertEquals(did, userDid); + storedPreferences = preferences; + return Promise.resolve(); + }, + getPreferences: (did: string) => { + assertEquals(did, userDid); + return Promise.resolve({ + userDid, + createdAt: "2026-08-14T00:00:00.000Z", + updatedAt: "2026-08-14T00:00:00.000Z", + ...storedPreferences, + }); + }, + }, + }, + } as unknown as AppContext; + + let putHandler: PutPreferencesHandler = () => + Promise.reject(new Error("putPreferences handler was not registered")); + putPreferences( + handlerServer((handler: PutPreferencesHandler) => putHandler = handler), + ctx, + ); + + await putHandler({ + auth: { credentials: { iss: userDid } }, + input: { + body: { + preferences: [{ + $type: "so.sprk.actor.defs#contentLabelPref", + label: "sexual", + visibility: "warn", + }], + }, + }, + }); + + assertEquals(storedPreferences.contentLabelPrefs, [{ + label: "sexual", + visibility: "warn", + }]); + + let getHandler: GetPreferencesHandler = () => + Promise.reject(new Error("getPreferences handler was not registered")); + getPreferences( + handlerServer((handler: GetPreferencesHandler) => getHandler = handler), + ctx, + ); + + const response = await getHandler({ + auth: { credentials: { iss: userDid } }, + }); + + assertEquals(response.body.preferences, [{ + $type: "so.sprk.actor.defs#contentLabelPref", + label: "sexual", + visibility: "warn", + }]); +});