Skip to content

Commit b688e35

Browse files
authored
ENG-771 Handle empty account name (#364)
* Do not overwrite name with empty name * document upsert_accounts_in_space
1 parent 2afb249 commit b688e35

File tree

4 files changed

+62
-11
lines changed

4 files changed

+62
-11
lines changed

packages/database/doc/upsert_content.md

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
In general, for external references, you can either embed it inline, reference it by `X_local_id` (where local means the platform) or use the db_ids as in the tables.
44

55
```typescript
6-
import type { LocalDocumentDataInput, LocalContentDataInput } from '@repo/database/inputTypes.ts';
6+
import type { LocalAccountDataInput, LocalDocumentDataInput, LocalContentDataInput } from '@repo/database/inputTypes';
77

8+
const accounts: LocalAccountDataInput[] = [{
9+
"account_local_id": "sR22zZ470dNPkIf9PpjQXXdTBjG2", "name": "maparent" }];
810
const docs: LocalDocumentDataInput[] = [{ "source_local_id": "page1_uid", "created": "2000/01/01", "last_modified": "2001/01/02", author_local_id:"sR22zZ470dNPkIf9PpjQXXdTBjG2"}];
911
const contents: LocalContentDataInput[] = [
1012
{
@@ -32,6 +34,13 @@ const contents: LocalContentDataInput[] = [
3234
} }
3335
];
3436

37+
// optional preliminary step: upsert accounts.
38+
{
39+
const { data, error } = await client.rpc("upsert_accounts_in_space", { space_id_: 12, data: accounts as Json });
40+
if (error) console.error(error);
41+
console.log(data);
42+
}
43+
3544
// optional preliminary step: upsert documents.
3645
{
3746
const { data, error } = await client.rpc("upsert_documents", { v_space_id: 12, data: docs as Json });
Lines changed: 20 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,24 @@
11
import type { Database, TablesInsert } from "@repo/database/dbTypes";
22

3+
export type LocalAccountDataInput = Partial<
4+
Database["public"]["CompositeTypes"]["account_local_input"]
5+
>;
36
export type LocalDocumentDataInput = Partial<
4-
Omit<Database['public']["CompositeTypes"]["document_local_input"], "author_inline">
5-
& { author_inline: Partial<TablesInsert<"PlatformAccount">> }>;
7+
Omit<
8+
Database["public"]["CompositeTypes"]["document_local_input"],
9+
"author_inline"
10+
> & { author_inline: LocalAccountDataInput }
11+
>;
612
export type LocalContentDataInput = Partial<
7-
Omit<Database['public']["CompositeTypes"]["content_local_input"], "document_inline" | "author_inline" | "creator_inline">
8-
& {
9-
document_inline: LocalDocumentDataInput,
10-
author_inline: Partial<TablesInsert<"PlatformAccount">>,
11-
creator_inline: Partial<TablesInsert<"PlatformAccount">>
12-
}>;
13-
export type LocalConceptDataInput = Partial<Database['public']["CompositeTypes"]["concept_local_input"]>;
13+
Omit<
14+
Database["public"]["CompositeTypes"]["content_local_input"],
15+
"document_inline" | "author_inline" | "creator_inline"
16+
> & {
17+
document_inline: LocalDocumentDataInput;
18+
author_inline: LocalAccountDataInput;
19+
creator_inline: LocalAccountDataInput;
20+
}
21+
>;
22+
export type LocalConceptDataInput = Partial<
23+
Database["public"]["CompositeTypes"]["concept_local_input"]
24+
>;
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
CREATE OR REPLACE FUNCTION public.upsert_account_in_space(space_id_ bigint, local_account account_local_input)
2+
RETURNS bigint
3+
LANGUAGE plpgsql
4+
SECURITY DEFINER
5+
SET search_path TO ''
6+
AS $function$
7+
DECLARE
8+
platform_ public."Platform";
9+
account_id_ BIGINT;
10+
BEGIN
11+
SELECT platform INTO STRICT platform_ FROM public."Space" WHERE id = space_id_;
12+
INSERT INTO public."PlatformAccount" AS pa (
13+
account_local_id, name, platform
14+
) VALUES (
15+
local_account.account_local_id, local_account.name, platform_
16+
) ON CONFLICT (account_local_id, platform) DO UPDATE SET
17+
name = COALESCE(NULLIF(TRIM(EXCLUDED.name), ''), pa.name)
18+
RETURNING id INTO STRICT account_id_;
19+
INSERT INTO public."SpaceAccess" as sa (space_id, account_id, editor) values (space_id_, account_id_, COALESCE(local_account.space_editor, true))
20+
ON CONFLICT (space_id, account_id)
21+
DO UPDATE SET editor = COALESCE(local_account.space_editor, sa.editor, true);
22+
IF local_account.email IS NOT NULL THEN
23+
-- TODO: how to distinguish basic untrusted from platform placeholder email?
24+
INSERT INTO public."AgentIdentifier" as ai (account_id, value, identifier_type, trusted) VALUES (account_id_, local_account.email, 'email', COALESCE(local_account.email_trusted, false))
25+
ON CONFLICT (value, identifier_type, account_id)
26+
DO UPDATE SET trusted = COALESCE(local_account.email_trusted, ai.trusted, false);
27+
END IF;
28+
RETURN account_id_;
29+
END;
30+
$function$
31+
;

packages/database/supabase/schemas/account.sql

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,7 +126,7 @@ BEGIN
126126
) VALUES (
127127
local_account.account_local_id, local_account.name, platform_
128128
) ON CONFLICT (account_local_id, platform) DO UPDATE SET
129-
name = coalesce(local_account.name, pa.name)
129+
name = COALESCE(NULLIF(TRIM(EXCLUDED.name), ''), pa.name)
130130
RETURNING id INTO STRICT account_id_;
131131
INSERT INTO public."SpaceAccess" as sa (space_id, account_id, editor) values (space_id_, account_id_, COALESCE(local_account.space_editor, true))
132132
ON CONFLICT (space_id, account_id)

0 commit comments

Comments
 (0)