@things-factory/ai-dashboard 10.1.220 → 10.1.222

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (37) hide show
  1. package/client/components/card-dialogs.ts +1 -1
  2. package/client/utils/card-api.ts +1 -2
  3. package/dist-client/components/card-dialogs.js +1 -1
  4. package/dist-client/components/card-dialogs.js.map +1 -1
  5. package/dist-client/tsconfig.tsbuildinfo +1 -1
  6. package/dist-client/utils/card-api.d.ts +0 -1
  7. package/dist-client/utils/card-api.js +1 -1
  8. package/dist-client/utils/card-api.js.map +1 -1
  9. package/dist-server/service/card/card-access.d.ts +4 -33
  10. package/dist-server/service/card/card-access.js +6 -35
  11. package/dist-server/service/card/card-access.js.map +1 -1
  12. package/dist-server/service/card/card-resolver.js +11 -34
  13. package/dist-server/service/card/card-resolver.js.map +1 -1
  14. package/dist-server/service/card/card-run.d.ts +2 -0
  15. package/dist-server/service/card/card-run.js +7 -4
  16. package/dist-server/service/card/card-run.js.map +1 -1
  17. package/dist-server/service/card/card-tool.js +8 -12
  18. package/dist-server/service/card/card-tool.js.map +1 -1
  19. package/dist-server/service/card/card-types.d.ts +0 -1
  20. package/dist-server/service/card/card-types.js +0 -4
  21. package/dist-server/service/card/card-types.js.map +1 -1
  22. package/dist-server/tsconfig.tsbuildinfo +1 -1
  23. package/package.json +4 -3
  24. package/server/service/card/card-access.test.ts +5 -25
  25. package/server/service/card/card-access.ts +7 -43
  26. package/server/service/card/card-resolver.ts +15 -36
  27. package/server/service/card/card-run.ts +10 -5
  28. package/server/service/card/card-tool.ts +8 -11
  29. package/server/service/card/card-types.ts +0 -3
  30. package/server/service/card/card-words.test.ts +72 -0
  31. package/test/translations.test.ts +1 -1
  32. package/translations/en.json +2 -2
  33. package/translations/es.json +2 -2
  34. package/translations/ja.json +2 -2
  35. package/translations/ko.json +2 -2
  36. package/translations/ms.json +2 -2
  37. package/translations/zh.json +2 -2
@@ -58,7 +58,6 @@ export declare const cardApi: {
58
58
  shareOptions: () => Promise<{
59
59
  domainId: string;
60
60
  domainName: string;
61
- departmentsAvailable: boolean;
62
61
  departments: {
63
62
  id: string;
64
63
  name: string;
@@ -19,7 +19,7 @@ export const cardApi = {
19
19
  run: async (id) => (await ask(`query ($id: String!) { dashboardCardRun(id: $id) }`, { id })).dashboardCardRun,
20
20
  preview: async (sessionId, proposalKey) => (await ask(`query ($s: String!, $k: String!) { dashboardCardProposalPreview(sessionId: $s, proposalKey: $k) }`, { s: sessionId, k: proposalKey })).dashboardCardProposalPreview,
21
21
  versions: async (id) => (await ask(`query ($id: String!) { dashboardCardVersions(id: $id) { version name definition creatorName createdAt } }`, { id })).dashboardCardVersions,
22
- shareOptions: async () => (await ask(`query { dashboardShareOptions { domainId domainName departmentsAvailable departments { id name } peopleAvailable roles { id name note } } }`)).dashboardShareOptions,
22
+ shareOptions: async () => (await ask(`query { dashboardShareOptions { domainId domainName departments { id name } peopleAvailable roles { id name note } } }`)).dashboardShareOptions,
23
23
  people: async (text) => (await ask(`query ($text: String!) { dashboardSharePeople(text: $text) { id name note } }`, { text })).dashboardSharePeople,
24
24
  saveProposal: async (sessionId, proposalKey) => (await ask(`mutation ($s: String!, $k: String!) { saveDashboardCardProposal(sessionId: $s, proposalKey: $k) }`, { s: sessionId, k: proposalKey }, true)).saveDashboardCardProposal,
25
25
  rename: async (id, name) => (await ask(`mutation ($id: String!, $name: String!) { renameDashboardCard(id: $id, name: $name) { id } }`, { id, name }, true)).renameDashboardCard,
@@ -1 +1 @@
1
- {"version":3,"file":"card-api.js","sourceRoot":"","sources":["../../client/utils/card-api.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * The doors the dashboard screens call (server: card-resolver.ts). One place, so the page, the library and the\n * conversation's card read the same fields.\n */\nimport gql from 'graphql-tag'\n\nimport { client } from '@operato/graphql'\n\nexport interface CardShare {\n scope: 'USER' | 'DEPARTMENT' | 'ROLE' | 'DOMAIN'\n targetId: string\n targetName?: string | null\n}\n\nexport interface CardItem {\n id: string\n name: string\n description?: string | null\n version: number\n definition: any\n access: 'owner' | 'shared'\n ownerName?: string | null\n copiedFromId?: string | null\n placed: boolean\n shares?: CardShare[] | null\n updatedAt?: string | null\n}\n\nexport interface PlaceItem {\n id: string\n order: number\n width: number\n height: number\n card: CardItem\n}\n\nexport interface CardCounts {\n read: number\n total: number\n complete: boolean\n shaped: number\n shown: number\n}\n\nexport interface CardRun {\n block?: any\n issue?: { code: string; params?: Record<string, unknown> }\n counts?: CardCounts\n asOf: string\n source?: { key: string; labelKey?: string }\n}\n\nconst CARD_FIELDS = `id name description version definition access ownerName copiedFromId placed shares { scope targetId targetName } updatedAt`\n\nasync function ask<T>(document: string, variables: Record<string, unknown> = {}, mutate = false): Promise<T> {\n const response: any = mutate\n ? await client.mutate({ mutation: gql(document), variables })\n : await client.query({ query: gql(document), variables, fetchPolicy: 'no-cache' })\n if (response.errors?.length) throw new Error(response.errors[0].message)\n return response.data\n}\n\nexport const cardApi = {\n myDashboard: async () => (await ask<any>(`query { myDashboard { id order width height card { ${CARD_FIELDS} } } }`)).myDashboard as PlaceItem[],\n library: async (which: 'mine' | 'shared') => (await ask<any>(`query ($which: String!) { dashboardCards(which: $which) { ${CARD_FIELDS} } }`, { which })).dashboardCards as CardItem[],\n run: async (id: string) => (await ask<any>(`query ($id: String!) { dashboardCardRun(id: $id) }`, { id })).dashboardCardRun as CardRun,\n preview: async (sessionId: string, proposalKey: string) =>\n (await ask<any>(`query ($s: String!, $k: String!) { dashboardCardProposalPreview(sessionId: $s, proposalKey: $k) }`, { s: sessionId, k: proposalKey })).dashboardCardProposalPreview as CardRun,\n versions: async (id: string) =>\n (await ask<any>(`query ($id: String!) { dashboardCardVersions(id: $id) { version name definition creatorName createdAt } }`, { id })).dashboardCardVersions as {\n version: number\n name: string\n definition: any\n creatorName?: string\n createdAt?: string\n }[],\n shareOptions: async () =>\n (await ask<any>(`query { dashboardShareOptions { domainId domainName departmentsAvailable departments { id name } peopleAvailable roles { id name note } } }`)).dashboardShareOptions as {\n domainId: string\n domainName: string\n departmentsAvailable: boolean\n departments: { id: string; name: string }[]\n peopleAvailable: boolean\n roles: { id: string; name: string; note?: string | null }[]\n },\n people: async (text: string) => (await ask<any>(`query ($text: String!) { dashboardSharePeople(text: $text) { id name note } }`, { text })).dashboardSharePeople as { id: string; name: string; note?: string }[],\n saveProposal: async (sessionId: string, proposalKey: string) =>\n (await ask<any>(`mutation ($s: String!, $k: String!) { saveDashboardCardProposal(sessionId: $s, proposalKey: $k) }`, { s: sessionId, k: proposalKey }, true)).saveDashboardCardProposal as {\n cardId: string\n version: number\n placeId: string\n again?: boolean\n },\n rename: async (id: string, name: string) => (await ask<any>(`mutation ($id: String!, $name: String!) { renameDashboardCard(id: $id, name: $name) { id } }`, { id, name }, true)).renameDashboardCard,\n restore: async (id: string, version: number) => (await ask<any>(`mutation ($id: String!, $v: Int!) { restoreDashboardCardVersion(id: $id, version: $v) { id } }`, { id, v: version }, true)).restoreDashboardCardVersion,\n copy: async (id: string) => (await ask<any>(`mutation ($id: String!) { copyDashboardCard(id: $id) { id } }`, { id }, true)).copyDashboardCard,\n remove: async (id: string) => (await ask<any>(`mutation ($id: String!) { deleteDashboardCard(id: $id) }`, { id }, true)).deleteDashboardCard,\n share: async (id: string, shares: CardShare[]) =>\n (await ask<any>(`mutation ($id: String!, $shares: [DashboardCardShareInput!]!) { shareDashboardCard(id: $id, shares: $shares) { ${CARD_FIELDS} } }`, { id, shares }, true)).shareDashboardCard as CardItem,\n place: async (cardId: string) => (await ask<any>(`mutation ($id: String!) { placeDashboardCard(cardId: $id) { id } }`, { id: cardId }, true)).placeDashboardCard,\n unplace: async (id: string) => (await ask<any>(`mutation ($id: String!) { removeDashboardPlace(id: $id) }`, { id }, true)).removeDashboardPlace,\n arrange: async (places: { id: string; order: number; width: number; height: number }[]) =>\n (await ask<any>(`mutation ($places: [DashboardPlaceInput!]!) { arrangeDashboard(places: $places) }`, { places }, true)).arrangeDashboard\n}\n\n/** Told when a card is saved, copied, placed or removed elsewhere - an open dashboard reads itself again. */\nexport const DASHBOARD_CHANGED = 'ai-dashboard-changed'\n\nexport function dashboardChanged(): void {\n window.dispatchEvent(new CustomEvent(DASHBOARD_CHANGED))\n}\n"]}
1
+ {"version":3,"file":"card-api.js","sourceRoot":"","sources":["../../client/utils/card-api.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * The doors the dashboard screens call (server: card-resolver.ts). One place, so the page, the library and the\n * conversation's card read the same fields.\n */\nimport gql from 'graphql-tag'\n\nimport { client } from '@operato/graphql'\n\nexport interface CardShare {\n scope: 'USER' | 'DEPARTMENT' | 'ROLE' | 'DOMAIN'\n targetId: string\n targetName?: string | null\n}\n\nexport interface CardItem {\n id: string\n name: string\n description?: string | null\n version: number\n definition: any\n access: 'owner' | 'shared'\n ownerName?: string | null\n copiedFromId?: string | null\n placed: boolean\n shares?: CardShare[] | null\n updatedAt?: string | null\n}\n\nexport interface PlaceItem {\n id: string\n order: number\n width: number\n height: number\n card: CardItem\n}\n\nexport interface CardCounts {\n read: number\n total: number\n complete: boolean\n shaped: number\n shown: number\n}\n\nexport interface CardRun {\n block?: any\n issue?: { code: string; params?: Record<string, unknown> }\n counts?: CardCounts\n asOf: string\n source?: { key: string; labelKey?: string }\n}\n\nconst CARD_FIELDS = `id name description version definition access ownerName copiedFromId placed shares { scope targetId targetName } updatedAt`\n\nasync function ask<T>(document: string, variables: Record<string, unknown> = {}, mutate = false): Promise<T> {\n const response: any = mutate\n ? await client.mutate({ mutation: gql(document), variables })\n : await client.query({ query: gql(document), variables, fetchPolicy: 'no-cache' })\n if (response.errors?.length) throw new Error(response.errors[0].message)\n return response.data\n}\n\nexport const cardApi = {\n myDashboard: async () => (await ask<any>(`query { myDashboard { id order width height card { ${CARD_FIELDS} } } }`)).myDashboard as PlaceItem[],\n library: async (which: 'mine' | 'shared') => (await ask<any>(`query ($which: String!) { dashboardCards(which: $which) { ${CARD_FIELDS} } }`, { which })).dashboardCards as CardItem[],\n run: async (id: string) => (await ask<any>(`query ($id: String!) { dashboardCardRun(id: $id) }`, { id })).dashboardCardRun as CardRun,\n preview: async (sessionId: string, proposalKey: string) =>\n (await ask<any>(`query ($s: String!, $k: String!) { dashboardCardProposalPreview(sessionId: $s, proposalKey: $k) }`, { s: sessionId, k: proposalKey })).dashboardCardProposalPreview as CardRun,\n versions: async (id: string) =>\n (await ask<any>(`query ($id: String!) { dashboardCardVersions(id: $id) { version name definition creatorName createdAt } }`, { id })).dashboardCardVersions as {\n version: number\n name: string\n definition: any\n creatorName?: string\n createdAt?: string\n }[],\n shareOptions: async () =>\n (await ask<any>(`query { dashboardShareOptions { domainId domainName departments { id name } peopleAvailable roles { id name note } } }`)).dashboardShareOptions as {\n domainId: string\n domainName: string\n departments: { id: string; name: string }[]\n peopleAvailable: boolean\n roles: { id: string; name: string; note?: string | null }[]\n },\n people: async (text: string) => (await ask<any>(`query ($text: String!) { dashboardSharePeople(text: $text) { id name note } }`, { text })).dashboardSharePeople as { id: string; name: string; note?: string }[],\n saveProposal: async (sessionId: string, proposalKey: string) =>\n (await ask<any>(`mutation ($s: String!, $k: String!) { saveDashboardCardProposal(sessionId: $s, proposalKey: $k) }`, { s: sessionId, k: proposalKey }, true)).saveDashboardCardProposal as {\n cardId: string\n version: number\n placeId: string\n again?: boolean\n },\n rename: async (id: string, name: string) => (await ask<any>(`mutation ($id: String!, $name: String!) { renameDashboardCard(id: $id, name: $name) { id } }`, { id, name }, true)).renameDashboardCard,\n restore: async (id: string, version: number) => (await ask<any>(`mutation ($id: String!, $v: Int!) { restoreDashboardCardVersion(id: $id, version: $v) { id } }`, { id, v: version }, true)).restoreDashboardCardVersion,\n copy: async (id: string) => (await ask<any>(`mutation ($id: String!) { copyDashboardCard(id: $id) { id } }`, { id }, true)).copyDashboardCard,\n remove: async (id: string) => (await ask<any>(`mutation ($id: String!) { deleteDashboardCard(id: $id) }`, { id }, true)).deleteDashboardCard,\n share: async (id: string, shares: CardShare[]) =>\n (await ask<any>(`mutation ($id: String!, $shares: [DashboardCardShareInput!]!) { shareDashboardCard(id: $id, shares: $shares) { ${CARD_FIELDS} } }`, { id, shares }, true)).shareDashboardCard as CardItem,\n place: async (cardId: string) => (await ask<any>(`mutation ($id: String!) { placeDashboardCard(cardId: $id) { id } }`, { id: cardId }, true)).placeDashboardCard,\n unplace: async (id: string) => (await ask<any>(`mutation ($id: String!) { removeDashboardPlace(id: $id) }`, { id }, true)).removeDashboardPlace,\n arrange: async (places: { id: string; order: number; width: number; height: number }[]) =>\n (await ask<any>(`mutation ($places: [DashboardPlaceInput!]!) { arrangeDashboard(places: $places) }`, { places }, true)).arrangeDashboard\n}\n\n/** Told when a card is saved, copied, placed or removed elsewhere - an open dashboard reads itself again. */\nexport const DASHBOARD_CHANGED = 'ai-dashboard-changed'\n\nexport function dashboardChanged(): void {\n window.dispatchEvent(new CustomEvent(DASHBOARD_CHANGED))\n}\n"]}
@@ -1,38 +1,9 @@
1
+ import { type AudienceMember, type AudienceTarget } from '@things-factory/organization';
1
2
  export type CardAccess = 'owner' | 'shared';
2
- export interface CardShareRow {
3
- scope: 'USER' | 'DEPARTMENT' | 'ROLE' | 'DOMAIN' | string;
4
- targetId: string;
5
- }
6
- export interface CardViewer {
7
- userId: string;
8
- domainId: string;
9
- /** The departments of the viewer's active employee records - none where the organization module is not there. */
10
- departmentIds: readonly string[];
11
- /** The roles the viewer holds in the domain, the ones it inherits included - a role share reaches whoever holds it. */
12
- roleIds?: readonly string[];
13
- }
3
+ export type CardShareRow = AudienceTarget;
4
+ /** The viewer as an audience sees them - the departments they stand in (those above included) and the roles they hold. */
5
+ export type CardViewer = AudienceMember;
14
6
  export declare function cardAccessOf(card: {
15
7
  ownerId?: string | null;
16
8
  domainId?: string | null;
17
9
  }, viewer: CardViewer, shares: readonly CardShareRow[]): CardAccess | undefined;
18
- /**
19
- * The departments a person belongs to for sharing - their employee records that are active (`active = true`; an
20
- * unset `active` is not taken, as the assistant's people read takes only `active eq true`), each record's department.
21
- * A person with several records belongs to each record's department. Nothing is guessed: a record without a
22
- * department adds none.
23
- */
24
- export declare function departmentsOfEmployees(records: readonly {
25
- active?: boolean | null;
26
- department?: {
27
- id?: string | null;
28
- } | null;
29
- }[] | null | undefined): string[];
30
- /**
31
- * A share the owner may give - a known scope with a target; the domain scope names the owner's own domain, a role one
32
- * of the domain's roles (`roleIds`, the ones it inherits included).
33
- */
34
- export declare function shareRefusal(share: CardShareRow, owner: {
35
- domainId: string;
36
- departmentsAvailable: boolean;
37
- roleIds?: readonly string[];
38
- }): string | undefined;
@@ -1,51 +1,22 @@
1
1
  "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.cardAccessOf = cardAccessOf;
2
4
  /*
3
5
  * Who may use a card (ADR-0160 decisions 6, 7) - the first of the two checks; the data's own door is the second, asked
4
6
  * when the card is run. Using a card means reading its definition and running it as oneself: a share gives the
5
7
  * definition, never the data behind it. Asked again on every read, run, placing and copy - a share withdrawn is gone
6
8
  * at once, whatever is still placed.
7
9
  *
10
+ * Whom a share reaches is the audience rule of organization (ADR-0163 decision 2) - the one an announcement asks too.
11
+ *
8
12
  * Pure - the rule is tested without a database.
9
13
  */
10
- Object.defineProperty(exports, "__esModule", { value: true });
11
- exports.cardAccessOf = cardAccessOf;
12
- exports.departmentsOfEmployees = departmentsOfEmployees;
13
- exports.shareRefusal = shareRefusal;
14
+ const organization_1 = require("@things-factory/organization");
14
15
  function cardAccessOf(card, viewer, shares) {
15
16
  if (!viewer.userId || !viewer.domainId || card.domainId !== viewer.domainId)
16
17
  return undefined;
17
18
  if (card.ownerId === viewer.userId)
18
19
  return 'owner';
19
- const shared = shares.some(share => (share.scope === 'USER' && share.targetId === viewer.userId) ||
20
- (share.scope === 'DOMAIN' && share.targetId === viewer.domainId) ||
21
- (share.scope === 'DEPARTMENT' && viewer.departmentIds.includes(share.targetId)) ||
22
- (share.scope === 'ROLE' && (viewer.roleIds ?? []).includes(share.targetId)));
23
- return shared ? 'shared' : undefined;
24
- }
25
- /**
26
- * The departments a person belongs to for sharing - their employee records that are active (`active = true`; an
27
- * unset `active` is not taken, as the assistant's people read takes only `active eq true`), each record's department.
28
- * A person with several records belongs to each record's department. Nothing is guessed: a record without a
29
- * department adds none.
30
- */
31
- function departmentsOfEmployees(records) {
32
- return [...new Set((records ?? []).filter(one => one?.active === true && one.department?.id).map(one => one.department.id))];
33
- }
34
- /**
35
- * A share the owner may give - a known scope with a target; the domain scope names the owner's own domain, a role one
36
- * of the domain's roles (`roleIds`, the ones it inherits included).
37
- */
38
- function shareRefusal(share, owner) {
39
- if (!['USER', 'DEPARTMENT', 'ROLE', 'DOMAIN'].includes(share.scope))
40
- return 'unknown-scope';
41
- if (!share.targetId)
42
- return 'no-target';
43
- if (share.scope === 'DOMAIN' && share.targetId !== owner.domainId)
44
- return 'another-domain';
45
- if (share.scope === 'DEPARTMENT' && !owner.departmentsAvailable)
46
- return 'no-departments';
47
- if (share.scope === 'ROLE' && !(owner.roleIds ?? []).includes(share.targetId))
48
- return 'unknown-role';
49
- return undefined;
20
+ return (0, organization_1.audienceReaches)(shares, viewer) ? 'shared' : undefined;
50
21
  }
51
22
  //# sourceMappingURL=card-access.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"card-access.js","sourceRoot":"","sources":["../../../server/service/card/card-access.ts"],"names":[],"mappings":";AAAA;;;;;;;GAOG;;AAkBH,oCAWC;AAQD,wDAEC;AAMD,oCAOC;AAlCD,SAAgB,YAAY,CAAC,IAA2D,EAAE,MAAkB,EAAE,MAA+B;IAC3I,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAA;IAC7F,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM,CAAC,MAAM;QAAE,OAAO,OAAO,CAAA;IAClD,MAAM,MAAM,GAAG,MAAM,CAAC,IAAI,CACxB,KAAK,CAAC,EAAE,CACN,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAC,MAAM,CAAC;QAC5D,CAAC,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ,CAAC;QAChE,CAAC,KAAK,CAAC,KAAK,KAAK,YAAY,IAAI,MAAM,CAAC,aAAa,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC;QAC/E,CAAC,KAAK,CAAC,KAAK,KAAK,MAAM,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAC9E,CAAA;IACD,OAAO,MAAM,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAA;AACtC,CAAC;AAED;;;;;GAKG;AACH,SAAgB,sBAAsB,CAAC,OAA8G;IACnJ,OAAO,CAAC,GAAG,IAAI,GAAG,CAAC,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,EAAE,MAAM,KAAK,IAAI,IAAI,GAAG,CAAC,UAAU,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,UAAW,CAAC,EAAG,CAAC,CAAC,CAAC,CAAA;AAChI,CAAC;AAED;;;GAGG;AACH,SAAgB,YAAY,CAAC,KAAmB,EAAE,KAAuF;IACvI,IAAI,CAAC,CAAC,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,KAAK,CAAC;QAAE,OAAO,eAAe,CAAA;IAC3F,IAAI,CAAC,KAAK,CAAC,QAAQ;QAAE,OAAO,WAAW,CAAA;IACvC,IAAI,KAAK,CAAC,KAAK,KAAK,QAAQ,IAAI,KAAK,CAAC,QAAQ,KAAK,KAAK,CAAC,QAAQ;QAAE,OAAO,gBAAgB,CAAA;IAC1F,IAAI,KAAK,CAAC,KAAK,KAAK,YAAY,IAAI,CAAC,KAAK,CAAC,oBAAoB;QAAE,OAAO,gBAAgB,CAAA;IACxF,IAAI,KAAK,CAAC,KAAK,KAAK,MAAM,IAAI,CAAC,CAAC,KAAK,CAAC,OAAO,IAAI,EAAE,CAAC,CAAC,QAAQ,CAAC,KAAK,CAAC,QAAQ,CAAC;QAAE,OAAO,cAAc,CAAA;IACpG,OAAO,SAAS,CAAA;AAClB,CAAC","sourcesContent":["/*\n * Who may use a card (ADR-0160 decisions 6, 7) - the first of the two checks; the data's own door is the second, asked\n * when the card is run. Using a card means reading its definition and running it as oneself: a share gives the\n * definition, never the data behind it. Asked again on every read, run, placing and copy - a share withdrawn is gone\n * at once, whatever is still placed.\n *\n * Pure - the rule is tested without a database.\n */\n\nexport type CardAccess = 'owner' | 'shared'\n\nexport interface CardShareRow {\n scope: 'USER' | 'DEPARTMENT' | 'ROLE' | 'DOMAIN' | string\n targetId: string\n}\n\nexport interface CardViewer {\n userId: string\n domainId: string\n /** The departments of the viewer's active employee records - none where the organization module is not there. */\n departmentIds: readonly string[]\n /** The roles the viewer holds in the domain, the ones it inherits included - a role share reaches whoever holds it. */\n roleIds?: readonly string[]\n}\n\nexport function cardAccessOf(card: { ownerId?: string | null; domainId?: string | null }, viewer: CardViewer, shares: readonly CardShareRow[]): CardAccess | undefined {\n if (!viewer.userId || !viewer.domainId || card.domainId !== viewer.domainId) return undefined\n if (card.ownerId === viewer.userId) return 'owner'\n const shared = shares.some(\n share =>\n (share.scope === 'USER' && share.targetId === viewer.userId) ||\n (share.scope === 'DOMAIN' && share.targetId === viewer.domainId) ||\n (share.scope === 'DEPARTMENT' && viewer.departmentIds.includes(share.targetId)) ||\n (share.scope === 'ROLE' && (viewer.roleIds ?? []).includes(share.targetId))\n )\n return shared ? 'shared' : undefined\n}\n\n/**\n * The departments a person belongs to for sharing - their employee records that are active (`active = true`; an\n * unset `active` is not taken, as the assistant's people read takes only `active eq true`), each record's department.\n * A person with several records belongs to each record's department. Nothing is guessed: a record without a\n * department adds none.\n */\nexport function departmentsOfEmployees(records: readonly { active?: boolean | null; department?: { id?: string | null } | null }[] | null | undefined): string[] {\n return [...new Set((records ?? []).filter(one => one?.active === true && one.department?.id).map(one => one.department!.id!))]\n}\n\n/**\n * A share the owner may give - a known scope with a target; the domain scope names the owner's own domain, a role one\n * of the domain's roles (`roleIds`, the ones it inherits included).\n */\nexport function shareRefusal(share: CardShareRow, owner: { domainId: string; departmentsAvailable: boolean; roleIds?: readonly string[] }): string | undefined {\n if (!['USER', 'DEPARTMENT', 'ROLE', 'DOMAIN'].includes(share.scope)) return 'unknown-scope'\n if (!share.targetId) return 'no-target'\n if (share.scope === 'DOMAIN' && share.targetId !== owner.domainId) return 'another-domain'\n if (share.scope === 'DEPARTMENT' && !owner.departmentsAvailable) return 'no-departments'\n if (share.scope === 'ROLE' && !(owner.roleIds ?? []).includes(share.targetId)) return 'unknown-role'\n return undefined\n}\n"]}
1
+ {"version":3,"file":"card-access.js","sourceRoot":"","sources":["../../../server/service/card/card-access.ts"],"names":[],"mappings":";;AAmBA,oCAIC;AAvBD;;;;;;;;;GASG;AACH,+DAAwG;AASxG,SAAgB,YAAY,CAAC,IAA2D,EAAE,MAAkB,EAAE,MAA+B;IAC3I,IAAI,CAAC,MAAM,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,QAAQ,IAAI,IAAI,CAAC,QAAQ,KAAK,MAAM,CAAC,QAAQ;QAAE,OAAO,SAAS,CAAA;IAC7F,IAAI,IAAI,CAAC,OAAO,KAAK,MAAM,CAAC,MAAM;QAAE,OAAO,OAAO,CAAA;IAClD,OAAO,IAAA,8BAAe,EAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,SAAS,CAAA;AAC/D,CAAC","sourcesContent":["/*\n * Who may use a card (ADR-0160 decisions 6, 7) - the first of the two checks; the data's own door is the second, asked\n * when the card is run. Using a card means reading its definition and running it as oneself: a share gives the\n * definition, never the data behind it. Asked again on every read, run, placing and copy - a share withdrawn is gone\n * at once, whatever is still placed.\n *\n * Whom a share reaches is the audience rule of organization (ADR-0163 decision 2) - the one an announcement asks too.\n *\n * Pure - the rule is tested without a database.\n */\nimport { audienceReaches, type AudienceMember, type AudienceTarget } from '@things-factory/organization'\n\nexport type CardAccess = 'owner' | 'shared'\n\nexport type CardShareRow = AudienceTarget\n\n/** The viewer as an audience sees them - the departments they stand in (those above included) and the roles they hold. */\nexport type CardViewer = AudienceMember\n\nexport function cardAccessOf(card: { ownerId?: string | null; domainId?: string | null }, viewer: CardViewer, shares: readonly CardShareRow[]): CardAccess | undefined {\n if (!viewer.userId || !viewer.domainId || card.domainId !== viewer.domainId) return undefined\n if (card.ownerId === viewer.userId) return 'owner'\n return audienceReaches(shares, viewer) ? 'shared' : undefined\n}\n"]}
@@ -16,6 +16,7 @@ const graphql_scalars_1 = require("graphql-scalars");
16
16
  const typeorm_1 = require("typeorm");
17
17
  const shell_1 = require("@things-factory/shell");
18
18
  const auth_base_1 = require("@things-factory/auth-base");
19
+ const organization_1 = require("@things-factory/organization");
19
20
  const ai_assistant_1 = require("@things-factory/ai-assistant");
20
21
  const card_access_js_1 = require("./card-access.js");
21
22
  const card_definition_js_1 = require("./card-definition.js");
@@ -35,40 +36,16 @@ function refuse(context, code, fallback, options = {}) {
35
36
  error.extensions = { code: `ai-dashboard.${code}` };
36
37
  throw error;
37
38
  }
38
- /** The viewer of a request, with the departments they belong to for sharing - asked once per request. */
39
39
  /**
40
- * The roles of the domain - the ones it inherits from its parent included, as its privileges are (User.getPrivilegesByDomain);
41
- * `holder` keeps those one person holds.
40
+ * The viewer of a request as an audience sees them (organization, ADR-0163 decision 2), and the departments of their own
41
+ * active records - the ones they may share with. Asked once per request.
42
42
  */
43
- async function domainRoles(context, holder, tx) {
44
- const qb = (0, shell_1.getRepository)(auth_base_1.Role, tx).createQueryBuilder('ROLE');
45
- if (holder)
46
- qb.innerJoin('ROLE.users', 'HOLDER', 'HOLDER.id = :holder', { holder });
47
- (0, shell_1.applyDomainInheritanceFilter)(qb, 'ROLE', context.state.domain, shell_1.InheritedValueType.Include);
48
- return await qb.orderBy('ROLE.name').getMany();
49
- }
50
43
  async function viewerOf(context) {
51
44
  const state = context.state;
52
45
  if (state.__aiDashboardViewer)
53
46
  return state.__aiDashboardViewer;
54
- let records;
55
- try {
56
- /* The organization module's own door, as the viewer - absent in an application without it. */
57
- const answer = await (0, ai_assistant_1.runAsCaller)(context)('query { myEmployees { active department { id name } } }', {});
58
- if (!answer.errors?.length)
59
- records = answer.data?.myEmployees ?? [];
60
- }
61
- catch {
62
- records = undefined;
63
- }
64
- const departmentIds = (0, card_access_js_1.departmentsOfEmployees)(records);
65
- const departments = departmentIds.map(id => ({ id, name: records.find(one => one?.department?.id === id)?.department?.name ?? id }));
66
- const roleIds = state.user?.id ? (await domainRoles(context, state.user.id)).map(one => one.id) : [];
67
- const answer = {
68
- viewer: { userId: state.user?.id, domainId: state.domain?.id, departmentIds, roleIds },
69
- departmentsAvailable: records !== undefined,
70
- departments
71
- };
47
+ const { ownDepartments, ...viewer } = await (0, organization_1.audienceMemberOf)(state.domain, state.user ?? {});
48
+ const answer = { viewer, departments: ownDepartments };
72
49
  state.__aiDashboardViewer = answer;
73
50
  return answer;
74
51
  }
@@ -139,6 +116,7 @@ async function runAsViewer(definition, context) {
139
116
  passesDoor: door => (0, ai_assistant_1.toolAccessFor)(context)(door),
140
117
  run: (0, ai_assistant_1.runAsCaller)(context),
141
118
  today: (0, card_definition_js_1.todayIn)(context.state.domain?.timezone),
119
+ timeZone: context.state.domain?.timezone,
142
120
  words: (key, fallback) => {
143
121
  if (!key || typeof context.t !== 'function')
144
122
  return fallback;
@@ -203,15 +181,14 @@ let DashboardCardResolver = class DashboardCardResolver {
203
181
  return versions.map(one => ({ version: one.version, name: one.name, definition: one.definition, creatorName: names.get(one.creatorId), createdAt: one.createdAt }));
204
182
  }
205
183
  async dashboardShareOptions(context) {
206
- const { departmentsAvailable, departments } = await viewerOf(context);
184
+ const { departments } = await viewerOf(context);
207
185
  const domain = context.state.domain;
208
186
  return {
209
187
  domainId: domain.id,
210
188
  domainName: domain.name ?? domain.subdomain ?? domain.id,
211
- departmentsAvailable,
212
189
  departments,
213
190
  peopleAvailable: await (0, ai_assistant_1.toolAccessFor)(context)('Query.employees'),
214
- roles: (await domainRoles(context)).map(one => ({ id: one.id, name: one.name, ...(one.description ? { note: one.description } : {}) }))
191
+ roles: (await (0, organization_1.domainRolesOf)(context.state.domain)).map(one => ({ id: one.id, name: one.name, ...(one.description ? { note: one.description } : {}) }))
215
192
  };
216
193
  }
217
194
  async dashboardSharePeople(text, context) {
@@ -332,11 +309,11 @@ let DashboardCardResolver = class DashboardCardResolver {
332
309
  async shareDashboardCard(id, shares, context) {
333
310
  const { domain, user, tx } = context.state;
334
311
  const card = await ownCard(id, context, tx);
335
- const { departmentsAvailable } = await viewerOf(context);
336
- const roleIds = (shares ?? []).some(one => one.scope === dashboard_card_js_1.DashboardCardShareScope.ROLE) ? (await domainRoles(context, undefined, tx)).map(one => one.id) : [];
312
+ const roleIds = (shares ?? []).some(one => one.scope === dashboard_card_js_1.DashboardCardShareScope.ROLE) ? (await (0, organization_1.domainRolesOf)(domain, undefined, tx)).map(one => one.id) : [];
313
+ const departmentIds = (shares ?? []).some(one => one.scope === dashboard_card_js_1.DashboardCardShareScope.DEPARTMENT) ? [...(await (0, organization_1.departmentTreeOf)(domain, tx)).keys()] : [];
337
314
  const wanted = new Map();
338
315
  for (const share of shares ?? []) {
339
- const refusal = (0, card_access_js_1.shareRefusal)(share, { domainId: domain.id, departmentsAvailable, roleIds });
316
+ const refusal = (0, organization_1.audienceTargetRefusal)(share, { domainId: domain.id, departmentIds, roleIds });
340
317
  if (refusal)
341
318
  refuse(context, `share-${refusal}`, 'this share cannot be given ({code}).', { code: refusal });
342
319
  if (share.scope === dashboard_card_js_1.DashboardCardShareScope.USER && share.targetId === user.id)
@@ -1 +1 @@
1
- {"version":3,"file":"card-resolver.js","sourceRoot":"","sources":["../../../server/service/card/card-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * The doors of the dashboard cards (ADR-0160 decisions 6-10) - one's own cards and those shared with one, one's own\n * dashboard, a card's versions and shares (its owner's), running a card, and saving a proposal a conversation made.\n *\n * Every door asks who may use the card again (card-access.ts) - a share withdrawn closes at once. Running a card asks\n * the data's own door as the viewer and reads with the viewer's request (card-run.ts): the card gives the definition,\n * never the data.\n */\nimport { Arg, Ctx, Directive, Int, Mutation, Query, Resolver } from 'type-graphql'\nimport { GraphQLJSON } from 'graphql-scalars'\nimport { In, IsNull, Not } from 'typeorm'\n\nimport { applyDomainInheritanceFilter, getRepository, InheritedValueType } from '@things-factory/shell'\nimport { Role, User } from '@things-factory/auth-base'\nimport {\n assertMayWriteSession,\n ChatMessage,\n ChatSession,\n detailReadOf,\n isSessionParticipant,\n mayReadSession,\n readTargetOf,\n rootFieldOf,\n runAsCaller,\n toolAccessFor\n} from '@things-factory/ai-assistant'\n\nimport { cardAccessOf, departmentsOfEmployees, shareRefusal, type CardAccess, type CardViewer } from './card-access.js'\nimport { CARD_SCHEMA_VERSION, checkDefinition, sourceOf, todayIn, type CardDefinition } from './card-definition.js'\nimport { cardIdOf, findCardProposal } from './card-proposal.js'\nimport { runCard, type CardRunResult } from './card-run.js'\nimport { DashboardCard, DashboardCardPlace, DashboardCardShare, DashboardCardShareScope, DashboardCardVersion } from './dashboard-card.js'\nimport { DashboardCardItem, DashboardCardShareInput, DashboardCardVersionItem, DashboardPlaceInput, DashboardPlaceItem, DashboardShareChoice, DashboardShareOptions } from './card-types.js'\n\nconst QUERY = '@privilege(category: \"ai-dashboard\", privilege: \"query\", domainOwnerGranted: true)'\nconst MUTATION = '@privilege(category: \"ai-dashboard\", privilege: \"mutation\", domainOwnerGranted: true)'\n\nconst MAX_WIDTH = 4\nconst MAX_HEIGHT = 2\n\n/** A refusal said in the reader's words, with a code the screen may read. */\nfunction refuse(context: ResolverContext, code: string, fallback: string, options: Record<string, unknown> = {}): never {\n const message = context.t ? String(context.t(`ai-dashboard.refusal.${code}`, { defaultValue: fallback, ...options })) : fallback\n const error: any = new Error(message)\n error.extensions = { code: `ai-dashboard.${code}` }\n throw error\n}\n\n/** The viewer of a request, with the departments they belong to for sharing - asked once per request. */\n/**\n * The roles of the domain - the ones it inherits from its parent included, as its privileges are (User.getPrivilegesByDomain);\n * `holder` keeps those one person holds.\n */\nasync function domainRoles(context: ResolverContext, holder?: string, tx?: any): Promise<Role[]> {\n const qb = getRepository(Role, tx).createQueryBuilder('ROLE')\n if (holder) qb.innerJoin('ROLE.users', 'HOLDER', 'HOLDER.id = :holder', { holder })\n applyDomainInheritanceFilter(qb, 'ROLE', context.state.domain as any, InheritedValueType.Include)\n return await qb.orderBy('ROLE.name').getMany()\n}\n\nasync function viewerOf(context: ResolverContext): Promise<{ viewer: CardViewer; departmentsAvailable: boolean; departments: { id: string; name: string }[] }> {\n const state: any = context.state\n if (state.__aiDashboardViewer) return state.__aiDashboardViewer\n let records: any[] | undefined\n try {\n /* The organization module's own door, as the viewer - absent in an application without it. */\n const answer = await runAsCaller(context)('query { myEmployees { active department { id name } } }', {})\n if (!answer.errors?.length) records = answer.data?.myEmployees ?? []\n } catch {\n records = undefined\n }\n const departmentIds = departmentsOfEmployees(records)\n const departments = departmentIds.map(id => ({ id, name: records!.find(one => one?.department?.id === id)?.department?.name ?? id }))\n const roleIds = state.user?.id ? (await domainRoles(context, state.user.id)).map(one => one.id) : []\n const answer = {\n viewer: { userId: state.user?.id, domainId: state.domain?.id, departmentIds, roleIds },\n departmentsAvailable: records !== undefined,\n departments\n }\n state.__aiDashboardViewer = answer\n return answer\n}\n\nconst sharesOf = async (cardIds: string[], tx?: any) =>\n cardIds.length ? await getRepository(DashboardCardShare, tx).find({ where: { card: { id: In(cardIds) } } as any }) : []\n\n/** A card the viewer may use, and how - refused otherwise (decision 7). */\nasync function usableCard(given: string, context: ResolverContext, tx?: any): Promise<{ card: DashboardCard; access: CardAccess }> {\n /* A card's uuid or its key - anything else is no card, and is not handed to a database that refuses it as no uuid. */\n const id = cardIdOf(given)\n if (!id) refuse(context, 'unknown-card', 'there is no such card.')\n const card = await getRepository(DashboardCard, tx).findOne({ where: { id, domain: { id: context.state.domain.id } } as any })\n if (!card) refuse(context, 'unknown-card', 'there is no such card.')\n const { viewer } = await viewerOf(context)\n const access = cardAccessOf(card, viewer, await sharesOf([card.id], tx))\n if (!access) refuse(context, 'card-not-shared', 'this card is not shared with you.')\n return { card, access }\n}\n\nasync function ownCard(id: string, context: ResolverContext, tx?: any): Promise<DashboardCard> {\n const { card, access } = await usableCard(id, context, tx)\n if (access !== 'owner') refuse(context, 'not-your-card', 'only the one who made this card changes it - copy it to make your own.')\n return card\n}\n\nasync function namesOf(userIds: string[]): Promise<Map<string, string>> {\n const ids = [...new Set(userIds.filter(Boolean))]\n if (!ids.length) return new Map()\n const users = await getRepository(User).find({ where: { id: In(ids) } as any })\n return new Map(users.map(one => [one.id, one.name || one.email || one.id]))\n}\n\n/** The cards as the viewer sees them - each with its access, whether placed, and its shares for its owner. */\nasync function itemsOf(cards: DashboardCard[], context: ResolverContext): Promise<DashboardCardItem[]> {\n const { viewer } = await viewerOf(context)\n const shares = await sharesOf(cards.map(one => one.id))\n const placed = cards.length\n ? new Set((await getRepository(DashboardCardPlace).find({ where: { domain: { id: viewer.domainId }, user: { id: viewer.userId }, card: { id: In(cards.map(one => one.id)) } } as any })).map(one => one.cardId))\n : new Set<string>()\n const names = await namesOf(cards.map(one => one.ownerId))\n return cards.flatMap(card => {\n const mine = shares.filter(one => one.cardId === card.id)\n const access = cardAccessOf(card, viewer, mine)\n if (!access) return []\n return [\n {\n id: card.id,\n name: card.name,\n description: card.description,\n version: card.version,\n definition: card.definition,\n access,\n ownerName: names.get(card.ownerId),\n copiedFromId: card.copiedFromId,\n placed: placed.has(card.id),\n ...(access === 'owner' ? { shares: mine.map(one => ({ scope: one.scope, targetId: one.targetId, targetName: one.targetName })) } : {}),\n updatedAt: card.updatedAt\n }\n ]\n })\n}\n\n/** Runs a definition as the viewer - the data's door and the data's API, the viewer's (decision 6). */\nexport async function runAsViewer(definition: CardDefinition, context: ResolverContext): Promise<CardRunResult> {\n return await runCard(definition, {\n readTargetOf,\n detailReadOf,\n passesDoor: door => toolAccessFor(context)(door),\n run: runAsCaller(context),\n today: todayIn(context.state.domain?.timezone),\n words: (key, fallback) => {\n if (!key || typeof context.t !== 'function') return fallback\n const said = context.t(key)\n return said && said !== key ? String(said) : fallback\n }\n })\n}\n\n/** A definition fit to keep - its source known and every name its own. */\nfunction keepable(definition: any, context: ResolverContext): CardDefinition {\n const { source, issue } = sourceOf(definition?.source, readTargetOf, detailReadOf)\n if (!source) refuse(context, 'definition-unfit', 'the card reads nothing this application declares ({code}).', { code: issue?.code })\n const issues = checkDefinition(definition, source)\n if (issues.length) refuse(context, 'definition-unfit', 'the card definition does not fit its source ({code}).', { code: issues[0].code })\n return definition\n}\n\nasync function placeAtEnd(cardId: string, context: ResolverContext, tx: any): Promise<DashboardCardPlace> {\n const { domain, user } = context.state\n const repository = getRepository(DashboardCardPlace, tx)\n const existing = await repository.findOne({ where: { domain: { id: domain.id }, user: { id: user.id }, card: { id: cardId } } as any })\n if (existing) return existing\n const last = await repository.findOne({ where: { domain: { id: domain.id }, user: { id: user.id } } as any, order: { order: 'DESC' } as any })\n return await repository.save({ domain, user, card: { id: cardId }, order: (last?.order ?? -1) + 1, width: 2, height: 1, creator: user, updater: user } as any)\n}\n\n@Resolver()\nexport class DashboardCardResolver {\n @Directive(QUERY)\n @Query(returns => [DashboardPlaceItem], { description: \"The cards on the viewer's dashboard, in order - only those the viewer may still use.\" })\n async myDashboard(@Ctx() context: ResolverContext): Promise<DashboardPlaceItem[]> {\n const { domain, user } = context.state\n const places = await getRepository(DashboardCardPlace).find({ where: { domain: { id: domain.id }, user: { id: user.id } } as any, order: { order: 'ASC' } as any })\n const cards = places.length ? await getRepository(DashboardCard).find({ where: { id: In(places.map(one => one.cardId)), domain: { id: domain.id } } as any }) : []\n const items = new Map((await itemsOf(cards, context)).map(one => [one.id, one]))\n return places.flatMap(place => (items.has(place.cardId) ? [{ id: place.id, order: place.order, width: place.width, height: place.height, card: items.get(place.cardId)! }] : []))\n }\n\n @Directive(QUERY)\n @Query(returns => [DashboardCardItem], { description: \"The viewer's card library - 'mine', the cards they made, or 'shared', those shared with them.\" })\n async dashboardCards(@Arg('which', { description: \"'mine' or 'shared'.\" }) which: string, @Ctx() context: ResolverContext): Promise<DashboardCardItem[]> {\n const { viewer } = await viewerOf(context)\n if (which === 'mine') {\n const cards = await getRepository(DashboardCard).find({ where: { domain: { id: viewer.domainId }, owner: { id: viewer.userId } } as any, order: { updatedAt: 'DESC' } as any })\n return await itemsOf(cards, context)\n }\n const shares = await getRepository(DashboardCardShare).find({\n where: [\n { domain: { id: viewer.domainId }, scope: DashboardCardShareScope.USER, targetId: viewer.userId },\n { domain: { id: viewer.domainId }, scope: DashboardCardShareScope.DOMAIN, targetId: viewer.domainId },\n ...(viewer.departmentIds.length ? [{ domain: { id: viewer.domainId }, scope: DashboardCardShareScope.DEPARTMENT, targetId: In([...viewer.departmentIds]) }] : []),\n ...(viewer.roleIds?.length ? [{ domain: { id: viewer.domainId }, scope: DashboardCardShareScope.ROLE, targetId: In([...viewer.roleIds]) }] : [])\n ] as any\n })\n const ids = [...new Set(shares.map(one => one.cardId))]\n const cards = ids.length ? await getRepository(DashboardCard).find({ where: { id: In(ids), domain: { id: viewer.domainId }, owner: { id: Not(viewer.userId) } } as any, order: { updatedAt: 'DESC' } as any }) : []\n return await itemsOf(cards, context)\n }\n\n @Directive(QUERY)\n @Query(returns => GraphQLJSON, { description: 'Draws one card as the viewer - its block, how much of the source it was drawn from, or why it cannot be drawn. No model is asked.' })\n async dashboardCardRun(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<CardRunResult> {\n const { card } = await usableCard(id, context)\n return await runAsViewer(card.definition as CardDefinition, context)\n }\n\n @Directive(QUERY)\n @Query(returns => [DashboardCardVersionItem], { description: \"A card's versions, newest first - its owner only.\" })\n async dashboardCardVersions(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<DashboardCardVersionItem[]> {\n const card = await ownCard(id, context)\n const versions = await getRepository(DashboardCardVersion).find({ where: { card: { id: card.id } } as any, order: { version: 'DESC' } as any })\n const names = await namesOf(versions.map(one => one.creatorId))\n return versions.map(one => ({ version: one.version, name: one.name, definition: one.definition, creatorName: names.get(one.creatorId), createdAt: one.createdAt }))\n }\n\n @Directive(QUERY)\n @Query(returns => DashboardShareOptions, { description: 'What the viewer may share a card with - the domain, their own departments, and whether people can be looked up.' })\n async dashboardShareOptions(@Ctx() context: ResolverContext): Promise<DashboardShareOptions> {\n const { departmentsAvailable, departments } = await viewerOf(context)\n const domain: any = context.state.domain\n return {\n domainId: domain.id,\n domainName: domain.name ?? domain.subdomain ?? domain.id,\n departmentsAvailable,\n departments,\n peopleAvailable: await toolAccessFor(context)('Query.employees'),\n roles: (await domainRoles(context)).map(one => ({ id: one.id, name: one.name, ...(one.description ? { note: one.description } : {}) }))\n }\n }\n\n @Directive(QUERY)\n @Query(returns => [DashboardShareChoice], { description: \"People to share a card with, found by name through the organization's own list as the viewer.\" })\n async dashboardSharePeople(@Arg('text') text: string, @Ctx() context: ResolverContext): Promise<DashboardShareChoice[]> {\n const words = (text ?? '').trim()\n if (!words) return []\n const answer = await runAsCaller(context)(\n 'query ($filters: [Filter!], $pagination: Pagination) { employees(filters: $filters, pagination: $pagination) { items { name department { name } user { id } } } }',\n { filters: [{ name: 'active', operator: 'eq', value: true }, { name: 'name', operator: 'i_like', value: words }], pagination: { page: 1, limit: 20 } }\n )\n if (answer.errors?.length) refuse(context, 'people-unavailable', 'people cannot be looked up here.')\n return (answer.data?.employees?.items ?? [])\n .filter((one: any) => one?.user?.id && one.user.id !== context.state.user.id)\n .map((one: any) => ({ id: one.user.id, name: one.name, note: one.department?.name }))\n }\n\n @Directive(QUERY)\n @Query(returns => GraphQLJSON, {\n description: \"Draws a card a conversation proposed, as the one looking at the conversation - the proposal keeps the definition, never its values.\"\n })\n async dashboardCardProposalPreview(@Arg('sessionId') sessionId: string, @Arg('proposalKey') proposalKey: string, @Ctx() context: ResolverContext): Promise<CardRunResult> {\n const { domain, user } = context.state\n const session = await getRepository(ChatSession).findOneBy({ id: sessionId, domain: { id: domain.id } } as any)\n if (!session) refuse(context, 'unknown-conversation', 'there is no such conversation.')\n const participant = await isSessionParticipant(domain.id, session.id, user?.id)\n if (!mayReadSession(session.visibility, participant)) refuse(context, 'conversation-closed', 'this conversation is not open to you.')\n const { proposal } = findCardProposal(await proposalMessages(session.id), proposalKey)\n if (!proposal) refuse(context, 'unknown-proposal', 'there is no such card in this conversation.')\n return await runAsViewer(proposal.card.definition, context)\n }\n\n @Directive(MUTATION)\n @Directive('@transaction')\n @Mutation(returns => GraphQLJSON, {\n description:\n \"Saves a card a conversation proposed and places it on the viewer's dashboard - the stored proposal's definition, never one the screen sends. A change of a saved card is its owner's, from the version it was read at. Pressing it again answers the same card.\"\n })\n async saveDashboardCardProposal(@Arg('sessionId') sessionId: string, @Arg('proposalKey') proposalKey: string, @Ctx() context: ResolverContext): Promise<{ cardId: string; version: number; placeId: string; again?: boolean }> {\n const { domain, user, tx } = context.state as any\n const session = await getRepository(ChatSession, tx).findOneBy({ id: sessionId, domain: { id: domain.id } } as any)\n if (!session) refuse(context, 'unknown-conversation', 'there is no such conversation.')\n await assertMayWriteSession({\n session,\n userId: user?.id,\n isParticipant: () => isSessionParticipant(domain.id, session.id, user?.id),\n t: (key, options) => (context.t ? context.t(key, options) : String(options?.defaultValue ?? key))\n })\n\n /* Saved already - the same card, whoever's request it is now asked by. */\n const saved = await getRepository(DashboardCardVersion, tx).findOne({ where: { domain: { id: domain.id }, proposalSessionId: session.id, proposalKey } as any })\n if (saved) {\n const card = await ownCard(saved.cardId, context, tx)\n const place = await placeAtEnd(card.id, context, tx)\n return { cardId: card.id, version: saved.version, placeId: place.id, again: true }\n }\n\n const { proposal, superseded, notACard } = findCardProposal(await proposalMessages(session.id, tx), proposalKey)\n if (notACard) refuse(context, 'not-a-card', 'this proposal is not a dashboard card.')\n if (!proposal) refuse(context, 'unknown-proposal', 'there is no such card in this conversation.')\n if (superseded) refuse(context, 'superseded', 'a newer card replaced this one in the conversation - save that one.')\n const definition = keepable(proposal.card.definition, context)\n /* Keeping a card one cannot read draws nothing - the data's door is the saver's too. */\n const { source } = sourceOf(definition.source, readTargetOf, detailReadOf)\n if (!(await toolAccessFor(context)(rootFieldOf(source!.query, 'query')))) refuse(context, 'data-closed', 'you may not read the data this card draws.')\n const name = String(proposal.card.name ?? '').trim().slice(0, 100) || 'card'\n const description = proposal.card.description ? String(proposal.card.description).slice(0, 300) : null\n\n let card: DashboardCard\n let version: number\n if (proposal.card.cardId) {\n card = await ownCard(proposal.card.cardId, context, tx)\n if (proposal.card.baseVersion !== card.version) refuse(context, 'stale-version', 'the card changed since this proposal (now version {version}) - ask for the change again.', { version: card.version })\n version = card.version + 1\n await getRepository(DashboardCard, tx).save({ ...card, name, description, version, definitionJson: JSON.stringify(definition), updater: user } as any)\n } else {\n version = 1\n card = await getRepository(DashboardCard, tx).save({ domain, name, description, owner: user, version, definitionJson: JSON.stringify(definition), creator: user, updater: user } as any)\n }\n await getRepository(DashboardCardVersion, tx).save({ domain, card: { id: card.id }, version, name, definitionJson: JSON.stringify(definition), proposalSessionId: session.id, proposalKey, creator: user, updater: user } as any)\n const place = await placeAtEnd(card.id, context, tx)\n return { cardId: card.id, version, placeId: place.id }\n }\n\n @Directive(MUTATION)\n @Directive('@transaction')\n @Mutation(returns => DashboardCardItem, { description: \"Renames one's own card - a new version.\" })\n async renameDashboardCard(@Arg('id') id: string, @Arg('name') name: string, @Ctx() context: ResolverContext): Promise<DashboardCardItem> {\n const { domain, user, tx } = context.state as any\n const card = await ownCard(id, context, tx)\n const given = (name ?? '').trim().slice(0, 100)\n if (!given) refuse(context, 'no-name', 'a card needs a name.')\n const version = card.version + 1\n await getRepository(DashboardCard, tx).save({ ...card, name: given, version, updater: user } as any)\n await getRepository(DashboardCardVersion, tx).save({ domain, card: { id: card.id }, version, name: given, definitionJson: card.definitionJson, creator: user, updater: user } as any)\n return (await itemsOf([await getRepository(DashboardCard, tx).findOneBy({ id: card.id })], context))[0]\n }\n\n @Directive(MUTATION)\n @Directive('@transaction')\n @Mutation(returns => DashboardCardItem, { description: \"Brings back an earlier version of one's own card - its definition and name become a new version.\" })\n async restoreDashboardCardVersion(@Arg('id') id: string, @Arg('version', type => Int) version: number, @Ctx() context: ResolverContext): Promise<DashboardCardItem> {\n const { domain, user, tx } = context.state as any\n const card = await ownCard(id, context, tx)\n const earlier = await getRepository(DashboardCardVersion, tx).findOne({ where: { card: { id: card.id }, version } as any })\n if (!earlier) refuse(context, 'unknown-version', 'there is no such version.')\n keepable(earlier.definition, context)\n const next = card.version + 1\n await getRepository(DashboardCard, tx).save({ ...card, name: earlier.name, definitionJson: earlier.definitionJson, version: next, updater: user } as any)\n await getRepository(DashboardCardVersion, tx).save({ domain, card: { id: card.id }, version: next, name: earlier.name, definitionJson: earlier.definitionJson, creator: user, updater: user } as any)\n return (await itemsOf([await getRepository(DashboardCard, tx).findOneBy({ id: card.id })], context))[0]\n }\n\n @Directive(MUTATION)\n @Directive('@transaction')\n @Mutation(returns => DashboardCardItem, { description: 'Copies a card one may use into a card of one\\'s own, placed on one\\'s dashboard.' })\n async copyDashboardCard(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<DashboardCardItem> {\n const { domain, user, tx } = context.state as any\n const { card } = await usableCard(id, context, tx)\n const copy = await getRepository(DashboardCard, tx).save({ domain, name: card.name, description: card.description, owner: user, version: 1, definitionJson: card.definitionJson, copiedFromId: card.id, creator: user, updater: user } as any)\n await getRepository(DashboardCardVersion, tx).save({ domain, card: { id: copy.id }, version: 1, name: copy.name, definitionJson: copy.definitionJson, creator: user, updater: user } as any)\n await placeAtEnd(copy.id, context, tx)\n return (await itemsOf([copy], context))[0]\n }\n\n @Directive(MUTATION)\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: \"Deletes one's own card - its versions, shares and every place it was put.\" })\n async deleteDashboardCard(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { tx } = context.state as any\n const card = await ownCard(id, context, tx)\n for (const entity of [DashboardCardPlace, DashboardCardShare, DashboardCardVersion] as any[]) {\n const rows = await getRepository(entity, tx).find({ where: { card: { id: card.id } } as any })\n if (rows.length) await getRepository(entity, tx).softRemove(rows)\n }\n await getRepository(DashboardCard, tx).softRemove(card)\n return true\n }\n\n @Directive(MUTATION)\n @Directive('@transaction')\n @Mutation(returns => DashboardCardItem, { description: \"Sets who one's own card is shared with - the whole list; none keeps it to oneself. A share gives the definition, never the data.\" })\n async shareDashboardCard(@Arg('id') id: string, @Arg('shares', type => [DashboardCardShareInput]) shares: DashboardCardShareInput[], @Ctx() context: ResolverContext): Promise<DashboardCardItem> {\n const { domain, user, tx } = context.state as any\n const card = await ownCard(id, context, tx)\n const { departmentsAvailable } = await viewerOf(context)\n const roleIds = (shares ?? []).some(one => one.scope === DashboardCardShareScope.ROLE) ? (await domainRoles(context, undefined, tx)).map(one => one.id) : []\n const wanted = new Map<string, DashboardCardShareInput>()\n for (const share of shares ?? []) {\n const refusal = shareRefusal(share, { domainId: domain.id, departmentsAvailable, roleIds })\n if (refusal) refuse(context, `share-${refusal}`, 'this share cannot be given ({code}).', { code: refusal })\n if (share.scope === DashboardCardShareScope.USER && share.targetId === user.id) continue\n wanted.set(`${share.scope}:${share.targetId}`, share)\n }\n const repository = getRepository(DashboardCardShare, tx)\n const current = await repository.find({ where: { card: { id: card.id } } as any })\n const gone = current.filter(one => !wanted.has(`${one.scope}:${one.targetId}`))\n if (gone.length) await repository.softRemove(gone)\n for (const [key, share] of wanted) {\n if (current.some(one => `${one.scope}:${one.targetId}` === key)) continue\n await repository.save({ domain, card: { id: card.id }, scope: share.scope, targetId: share.targetId, targetName: share.targetName?.slice(0, 100), creator: user, updater: user } as any)\n }\n return (await itemsOf([card], context))[0]\n }\n\n @Directive(MUTATION)\n @Directive('@transaction')\n @Mutation(returns => DashboardPlaceItem, { description: \"Places a card one may use at the end of one's dashboard.\" })\n async placeDashboardCard(@Arg('cardId') cardId: string, @Ctx() context: ResolverContext): Promise<DashboardPlaceItem> {\n const { tx } = context.state as any\n const { card } = await usableCard(cardId, context, tx)\n const place = await placeAtEnd(card.id, context, tx)\n return { id: place.id, order: place.order, width: place.width, height: place.height, card: (await itemsOf([card], context))[0] }\n }\n\n @Directive(MUTATION)\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: \"Takes a card off one's dashboard - the card stays in the library.\" })\n async removeDashboardPlace(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, user, tx } = context.state as any\n const place = await getRepository(DashboardCardPlace, tx).findOne({ where: { id, domain: { id: domain.id }, user: { id: user.id } } as any })\n if (!place) refuse(context, 'unknown-place', 'that card is not on your dashboard.')\n await getRepository(DashboardCardPlace, tx).softRemove(place)\n return true\n }\n\n @Directive(MUTATION)\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: \"Sets the order and size of the cards on one's dashboard.\" })\n async arrangeDashboard(@Arg('places', type => [DashboardPlaceInput]) places: DashboardPlaceInput[], @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, user, tx } = context.state as any\n const repository = getRepository(DashboardCardPlace, tx)\n const mine = await repository.find({ where: { domain: { id: domain.id }, user: { id: user.id } } as any })\n for (const given of places ?? []) {\n const place = mine.find(one => one.id === given.id)\n if (!place) refuse(context, 'unknown-place', 'that card is not on your dashboard.')\n if (!(given.width >= 1 && given.width <= MAX_WIDTH && given.height >= 1 && given.height <= MAX_HEIGHT)) refuse(context, 'size-out-of-range', 'a card spans 1 to 4 columns and 1 to 2 rows.')\n await repository.save({ ...place, order: given.order, width: given.width, height: given.height, updater: user } as any)\n }\n return true\n }\n}\n\n/** The conversation's messages that carry proposals, oldest first. */\nasync function proposalMessages(sessionId: string, tx?: any): Promise<{ proposals: any[] }[]> {\n const carrying = await getRepository(ChatMessage, tx).find({\n select: ['id', 'proposals', 'createdAt'] as any,\n where: { session: { id: sessionId } as any, proposals: Not(IsNull()) } as any,\n order: { createdAt: 'ASC' } as any\n })\n return carrying.map((message: any) => ({ proposals: message.proposalsJson ?? [] }))\n}\n\nexport { CARD_SCHEMA_VERSION }\n"]}
1
+ {"version":3,"file":"card-resolver.js","sourceRoot":"","sources":["../../../server/service/card/card-resolver.ts"],"names":[],"mappings":"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","sourcesContent":["/*\n * The doors of the dashboard cards (ADR-0160 decisions 6-10) - one's own cards and those shared with one, one's own\n * dashboard, a card's versions and shares (its owner's), running a card, and saving a proposal a conversation made.\n *\n * Every door asks who may use the card again (card-access.ts) - a share withdrawn closes at once. Running a card asks\n * the data's own door as the viewer and reads with the viewer's request (card-run.ts): the card gives the definition,\n * never the data.\n */\nimport { Arg, Ctx, Directive, Int, Mutation, Query, Resolver } from 'type-graphql'\nimport { GraphQLJSON } from 'graphql-scalars'\nimport { In, IsNull, Not } from 'typeorm'\n\nimport { getRepository } from '@things-factory/shell'\nimport { User } from '@things-factory/auth-base'\nimport { audienceMemberOf, audienceTargetRefusal, departmentTreeOf, domainRolesOf } from '@things-factory/organization'\nimport {\n assertMayWriteSession,\n ChatMessage,\n ChatSession,\n detailReadOf,\n isSessionParticipant,\n mayReadSession,\n readTargetOf,\n rootFieldOf,\n runAsCaller,\n toolAccessFor\n} from '@things-factory/ai-assistant'\n\nimport { cardAccessOf, type CardAccess, type CardViewer } from './card-access.js'\nimport { CARD_SCHEMA_VERSION, checkDefinition, sourceOf, todayIn, type CardDefinition } from './card-definition.js'\nimport { cardIdOf, findCardProposal } from './card-proposal.js'\nimport { runCard, type CardRunResult } from './card-run.js'\nimport { DashboardCard, DashboardCardPlace, DashboardCardShare, DashboardCardShareScope, DashboardCardVersion } from './dashboard-card.js'\nimport { DashboardCardItem, DashboardCardShareInput, DashboardCardVersionItem, DashboardPlaceInput, DashboardPlaceItem, DashboardShareChoice, DashboardShareOptions } from './card-types.js'\n\nconst QUERY = '@privilege(category: \"ai-dashboard\", privilege: \"query\", domainOwnerGranted: true)'\nconst MUTATION = '@privilege(category: \"ai-dashboard\", privilege: \"mutation\", domainOwnerGranted: true)'\n\nconst MAX_WIDTH = 4\nconst MAX_HEIGHT = 2\n\n/** A refusal said in the reader's words, with a code the screen may read. */\nfunction refuse(context: ResolverContext, code: string, fallback: string, options: Record<string, unknown> = {}): never {\n const message = context.t ? String(context.t(`ai-dashboard.refusal.${code}`, { defaultValue: fallback, ...options })) : fallback\n const error: any = new Error(message)\n error.extensions = { code: `ai-dashboard.${code}` }\n throw error\n}\n\n/**\n * The viewer of a request as an audience sees them (organization, ADR-0163 decision 2), and the departments of their own\n * active records - the ones they may share with. Asked once per request.\n */\nasync function viewerOf(context: ResolverContext): Promise<{ viewer: CardViewer; departments: { id: string; name: string }[] }> {\n const state: any = context.state\n if (state.__aiDashboardViewer) return state.__aiDashboardViewer\n const { ownDepartments, ...viewer } = await audienceMemberOf(state.domain, state.user ?? {})\n const answer = { viewer, departments: ownDepartments }\n state.__aiDashboardViewer = answer\n return answer\n}\n\nconst sharesOf = async (cardIds: string[], tx?: any) =>\n cardIds.length ? await getRepository(DashboardCardShare, tx).find({ where: { card: { id: In(cardIds) } } as any }) : []\n\n/** A card the viewer may use, and how - refused otherwise (decision 7). */\nasync function usableCard(given: string, context: ResolverContext, tx?: any): Promise<{ card: DashboardCard; access: CardAccess }> {\n /* A card's uuid or its key - anything else is no card, and is not handed to a database that refuses it as no uuid. */\n const id = cardIdOf(given)\n if (!id) refuse(context, 'unknown-card', 'there is no such card.')\n const card = await getRepository(DashboardCard, tx).findOne({ where: { id, domain: { id: context.state.domain.id } } as any })\n if (!card) refuse(context, 'unknown-card', 'there is no such card.')\n const { viewer } = await viewerOf(context)\n const access = cardAccessOf(card, viewer, await sharesOf([card.id], tx))\n if (!access) refuse(context, 'card-not-shared', 'this card is not shared with you.')\n return { card, access }\n}\n\nasync function ownCard(id: string, context: ResolverContext, tx?: any): Promise<DashboardCard> {\n const { card, access } = await usableCard(id, context, tx)\n if (access !== 'owner') refuse(context, 'not-your-card', 'only the one who made this card changes it - copy it to make your own.')\n return card\n}\n\nasync function namesOf(userIds: string[]): Promise<Map<string, string>> {\n const ids = [...new Set(userIds.filter(Boolean))]\n if (!ids.length) return new Map()\n const users = await getRepository(User).find({ where: { id: In(ids) } as any })\n return new Map(users.map(one => [one.id, one.name || one.email || one.id]))\n}\n\n/** The cards as the viewer sees them - each with its access, whether placed, and its shares for its owner. */\nasync function itemsOf(cards: DashboardCard[], context: ResolverContext): Promise<DashboardCardItem[]> {\n const { viewer } = await viewerOf(context)\n const shares = await sharesOf(cards.map(one => one.id))\n const placed = cards.length\n ? new Set((await getRepository(DashboardCardPlace).find({ where: { domain: { id: viewer.domainId }, user: { id: viewer.userId }, card: { id: In(cards.map(one => one.id)) } } as any })).map(one => one.cardId))\n : new Set<string>()\n const names = await namesOf(cards.map(one => one.ownerId))\n return cards.flatMap(card => {\n const mine = shares.filter(one => one.cardId === card.id)\n const access = cardAccessOf(card, viewer, mine)\n if (!access) return []\n return [\n {\n id: card.id,\n name: card.name,\n description: card.description,\n version: card.version,\n definition: card.definition,\n access,\n ownerName: names.get(card.ownerId),\n copiedFromId: card.copiedFromId,\n placed: placed.has(card.id),\n ...(access === 'owner' ? { shares: mine.map(one => ({ scope: one.scope, targetId: one.targetId, targetName: one.targetName })) } : {}),\n updatedAt: card.updatedAt\n }\n ]\n })\n}\n\n/** Runs a definition as the viewer - the data's door and the data's API, the viewer's (decision 6). */\nexport async function runAsViewer(definition: CardDefinition, context: ResolverContext): Promise<CardRunResult> {\n return await runCard(definition, {\n readTargetOf,\n detailReadOf,\n passesDoor: door => toolAccessFor(context)(door),\n run: runAsCaller(context),\n today: todayIn(context.state.domain?.timezone),\n timeZone: context.state.domain?.timezone,\n words: (key, fallback) => {\n if (!key || typeof context.t !== 'function') return fallback\n const said = context.t(key)\n return said && said !== key ? String(said) : fallback\n }\n })\n}\n\n/** A definition fit to keep - its source known and every name its own. */\nfunction keepable(definition: any, context: ResolverContext): CardDefinition {\n const { source, issue } = sourceOf(definition?.source, readTargetOf, detailReadOf)\n if (!source) refuse(context, 'definition-unfit', 'the card reads nothing this application declares ({code}).', { code: issue?.code })\n const issues = checkDefinition(definition, source)\n if (issues.length) refuse(context, 'definition-unfit', 'the card definition does not fit its source ({code}).', { code: issues[0].code })\n return definition\n}\n\nasync function placeAtEnd(cardId: string, context: ResolverContext, tx: any): Promise<DashboardCardPlace> {\n const { domain, user } = context.state\n const repository = getRepository(DashboardCardPlace, tx)\n const existing = await repository.findOne({ where: { domain: { id: domain.id }, user: { id: user.id }, card: { id: cardId } } as any })\n if (existing) return existing\n const last = await repository.findOne({ where: { domain: { id: domain.id }, user: { id: user.id } } as any, order: { order: 'DESC' } as any })\n return await repository.save({ domain, user, card: { id: cardId }, order: (last?.order ?? -1) + 1, width: 2, height: 1, creator: user, updater: user } as any)\n}\n\n@Resolver()\nexport class DashboardCardResolver {\n @Directive(QUERY)\n @Query(returns => [DashboardPlaceItem], { description: \"The cards on the viewer's dashboard, in order - only those the viewer may still use.\" })\n async myDashboard(@Ctx() context: ResolverContext): Promise<DashboardPlaceItem[]> {\n const { domain, user } = context.state\n const places = await getRepository(DashboardCardPlace).find({ where: { domain: { id: domain.id }, user: { id: user.id } } as any, order: { order: 'ASC' } as any })\n const cards = places.length ? await getRepository(DashboardCard).find({ where: { id: In(places.map(one => one.cardId)), domain: { id: domain.id } } as any }) : []\n const items = new Map((await itemsOf(cards, context)).map(one => [one.id, one]))\n return places.flatMap(place => (items.has(place.cardId) ? [{ id: place.id, order: place.order, width: place.width, height: place.height, card: items.get(place.cardId)! }] : []))\n }\n\n @Directive(QUERY)\n @Query(returns => [DashboardCardItem], { description: \"The viewer's card library - 'mine', the cards they made, or 'shared', those shared with them.\" })\n async dashboardCards(@Arg('which', { description: \"'mine' or 'shared'.\" }) which: string, @Ctx() context: ResolverContext): Promise<DashboardCardItem[]> {\n const { viewer } = await viewerOf(context)\n if (which === 'mine') {\n const cards = await getRepository(DashboardCard).find({ where: { domain: { id: viewer.domainId }, owner: { id: viewer.userId } } as any, order: { updatedAt: 'DESC' } as any })\n return await itemsOf(cards, context)\n }\n const shares = await getRepository(DashboardCardShare).find({\n where: [\n { domain: { id: viewer.domainId }, scope: DashboardCardShareScope.USER, targetId: viewer.userId },\n { domain: { id: viewer.domainId }, scope: DashboardCardShareScope.DOMAIN, targetId: viewer.domainId },\n ...(viewer.departmentIds.length ? [{ domain: { id: viewer.domainId }, scope: DashboardCardShareScope.DEPARTMENT, targetId: In([...viewer.departmentIds]) }] : []),\n ...(viewer.roleIds?.length ? [{ domain: { id: viewer.domainId }, scope: DashboardCardShareScope.ROLE, targetId: In([...viewer.roleIds]) }] : [])\n ] as any\n })\n const ids = [...new Set(shares.map(one => one.cardId))]\n const cards = ids.length ? await getRepository(DashboardCard).find({ where: { id: In(ids), domain: { id: viewer.domainId }, owner: { id: Not(viewer.userId) } } as any, order: { updatedAt: 'DESC' } as any }) : []\n return await itemsOf(cards, context)\n }\n\n @Directive(QUERY)\n @Query(returns => GraphQLJSON, { description: 'Draws one card as the viewer - its block, how much of the source it was drawn from, or why it cannot be drawn. No model is asked.' })\n async dashboardCardRun(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<CardRunResult> {\n const { card } = await usableCard(id, context)\n return await runAsViewer(card.definition as CardDefinition, context)\n }\n\n @Directive(QUERY)\n @Query(returns => [DashboardCardVersionItem], { description: \"A card's versions, newest first - its owner only.\" })\n async dashboardCardVersions(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<DashboardCardVersionItem[]> {\n const card = await ownCard(id, context)\n const versions = await getRepository(DashboardCardVersion).find({ where: { card: { id: card.id } } as any, order: { version: 'DESC' } as any })\n const names = await namesOf(versions.map(one => one.creatorId))\n return versions.map(one => ({ version: one.version, name: one.name, definition: one.definition, creatorName: names.get(one.creatorId), createdAt: one.createdAt }))\n }\n\n @Directive(QUERY)\n @Query(returns => DashboardShareOptions, { description: 'What the viewer may share a card with - the domain, their own departments, and whether people can be looked up.' })\n async dashboardShareOptions(@Ctx() context: ResolverContext): Promise<DashboardShareOptions> {\n const { departments } = await viewerOf(context)\n const domain: any = context.state.domain\n return {\n domainId: domain.id,\n domainName: domain.name ?? domain.subdomain ?? domain.id,\n departments,\n peopleAvailable: await toolAccessFor(context)('Query.employees'),\n roles: (await domainRolesOf(context.state.domain)).map(one => ({ id: one.id, name: one.name, ...(one.description ? { note: one.description } : {}) }))\n }\n }\n\n @Directive(QUERY)\n @Query(returns => [DashboardShareChoice], { description: \"People to share a card with, found by name through the organization's own list as the viewer.\" })\n async dashboardSharePeople(@Arg('text') text: string, @Ctx() context: ResolverContext): Promise<DashboardShareChoice[]> {\n const words = (text ?? '').trim()\n if (!words) return []\n const answer = await runAsCaller(context)(\n 'query ($filters: [Filter!], $pagination: Pagination) { employees(filters: $filters, pagination: $pagination) { items { name department { name } user { id } } } }',\n { filters: [{ name: 'active', operator: 'eq', value: true }, { name: 'name', operator: 'i_like', value: words }], pagination: { page: 1, limit: 20 } }\n )\n if (answer.errors?.length) refuse(context, 'people-unavailable', 'people cannot be looked up here.')\n return (answer.data?.employees?.items ?? [])\n .filter((one: any) => one?.user?.id && one.user.id !== context.state.user.id)\n .map((one: any) => ({ id: one.user.id, name: one.name, note: one.department?.name }))\n }\n\n @Directive(QUERY)\n @Query(returns => GraphQLJSON, {\n description: \"Draws a card a conversation proposed, as the one looking at the conversation - the proposal keeps the definition, never its values.\"\n })\n async dashboardCardProposalPreview(@Arg('sessionId') sessionId: string, @Arg('proposalKey') proposalKey: string, @Ctx() context: ResolverContext): Promise<CardRunResult> {\n const { domain, user } = context.state\n const session = await getRepository(ChatSession).findOneBy({ id: sessionId, domain: { id: domain.id } } as any)\n if (!session) refuse(context, 'unknown-conversation', 'there is no such conversation.')\n const participant = await isSessionParticipant(domain.id, session.id, user?.id)\n if (!mayReadSession(session.visibility, participant)) refuse(context, 'conversation-closed', 'this conversation is not open to you.')\n const { proposal } = findCardProposal(await proposalMessages(session.id), proposalKey)\n if (!proposal) refuse(context, 'unknown-proposal', 'there is no such card in this conversation.')\n return await runAsViewer(proposal.card.definition, context)\n }\n\n @Directive(MUTATION)\n @Directive('@transaction')\n @Mutation(returns => GraphQLJSON, {\n description:\n \"Saves a card a conversation proposed and places it on the viewer's dashboard - the stored proposal's definition, never one the screen sends. A change of a saved card is its owner's, from the version it was read at. Pressing it again answers the same card.\"\n })\n async saveDashboardCardProposal(@Arg('sessionId') sessionId: string, @Arg('proposalKey') proposalKey: string, @Ctx() context: ResolverContext): Promise<{ cardId: string; version: number; placeId: string; again?: boolean }> {\n const { domain, user, tx } = context.state as any\n const session = await getRepository(ChatSession, tx).findOneBy({ id: sessionId, domain: { id: domain.id } } as any)\n if (!session) refuse(context, 'unknown-conversation', 'there is no such conversation.')\n await assertMayWriteSession({\n session,\n userId: user?.id,\n isParticipant: () => isSessionParticipant(domain.id, session.id, user?.id),\n t: (key, options) => (context.t ? context.t(key, options) : String(options?.defaultValue ?? key))\n })\n\n /* Saved already - the same card, whoever's request it is now asked by. */\n const saved = await getRepository(DashboardCardVersion, tx).findOne({ where: { domain: { id: domain.id }, proposalSessionId: session.id, proposalKey } as any })\n if (saved) {\n const card = await ownCard(saved.cardId, context, tx)\n const place = await placeAtEnd(card.id, context, tx)\n return { cardId: card.id, version: saved.version, placeId: place.id, again: true }\n }\n\n const { proposal, superseded, notACard } = findCardProposal(await proposalMessages(session.id, tx), proposalKey)\n if (notACard) refuse(context, 'not-a-card', 'this proposal is not a dashboard card.')\n if (!proposal) refuse(context, 'unknown-proposal', 'there is no such card in this conversation.')\n if (superseded) refuse(context, 'superseded', 'a newer card replaced this one in the conversation - save that one.')\n const definition = keepable(proposal.card.definition, context)\n /* Keeping a card one cannot read draws nothing - the data's door is the saver's too. */\n const { source } = sourceOf(definition.source, readTargetOf, detailReadOf)\n if (!(await toolAccessFor(context)(rootFieldOf(source!.query, 'query')))) refuse(context, 'data-closed', 'you may not read the data this card draws.')\n const name = String(proposal.card.name ?? '').trim().slice(0, 100) || 'card'\n const description = proposal.card.description ? String(proposal.card.description).slice(0, 300) : null\n\n let card: DashboardCard\n let version: number\n if (proposal.card.cardId) {\n card = await ownCard(proposal.card.cardId, context, tx)\n if (proposal.card.baseVersion !== card.version) refuse(context, 'stale-version', 'the card changed since this proposal (now version {version}) - ask for the change again.', { version: card.version })\n version = card.version + 1\n await getRepository(DashboardCard, tx).save({ ...card, name, description, version, definitionJson: JSON.stringify(definition), updater: user } as any)\n } else {\n version = 1\n card = await getRepository(DashboardCard, tx).save({ domain, name, description, owner: user, version, definitionJson: JSON.stringify(definition), creator: user, updater: user } as any)\n }\n await getRepository(DashboardCardVersion, tx).save({ domain, card: { id: card.id }, version, name, definitionJson: JSON.stringify(definition), proposalSessionId: session.id, proposalKey, creator: user, updater: user } as any)\n const place = await placeAtEnd(card.id, context, tx)\n return { cardId: card.id, version, placeId: place.id }\n }\n\n @Directive(MUTATION)\n @Directive('@transaction')\n @Mutation(returns => DashboardCardItem, { description: \"Renames one's own card - a new version.\" })\n async renameDashboardCard(@Arg('id') id: string, @Arg('name') name: string, @Ctx() context: ResolverContext): Promise<DashboardCardItem> {\n const { domain, user, tx } = context.state as any\n const card = await ownCard(id, context, tx)\n const given = (name ?? '').trim().slice(0, 100)\n if (!given) refuse(context, 'no-name', 'a card needs a name.')\n const version = card.version + 1\n await getRepository(DashboardCard, tx).save({ ...card, name: given, version, updater: user } as any)\n await getRepository(DashboardCardVersion, tx).save({ domain, card: { id: card.id }, version, name: given, definitionJson: card.definitionJson, creator: user, updater: user } as any)\n return (await itemsOf([await getRepository(DashboardCard, tx).findOneBy({ id: card.id })], context))[0]\n }\n\n @Directive(MUTATION)\n @Directive('@transaction')\n @Mutation(returns => DashboardCardItem, { description: \"Brings back an earlier version of one's own card - its definition and name become a new version.\" })\n async restoreDashboardCardVersion(@Arg('id') id: string, @Arg('version', type => Int) version: number, @Ctx() context: ResolverContext): Promise<DashboardCardItem> {\n const { domain, user, tx } = context.state as any\n const card = await ownCard(id, context, tx)\n const earlier = await getRepository(DashboardCardVersion, tx).findOne({ where: { card: { id: card.id }, version } as any })\n if (!earlier) refuse(context, 'unknown-version', 'there is no such version.')\n keepable(earlier.definition, context)\n const next = card.version + 1\n await getRepository(DashboardCard, tx).save({ ...card, name: earlier.name, definitionJson: earlier.definitionJson, version: next, updater: user } as any)\n await getRepository(DashboardCardVersion, tx).save({ domain, card: { id: card.id }, version: next, name: earlier.name, definitionJson: earlier.definitionJson, creator: user, updater: user } as any)\n return (await itemsOf([await getRepository(DashboardCard, tx).findOneBy({ id: card.id })], context))[0]\n }\n\n @Directive(MUTATION)\n @Directive('@transaction')\n @Mutation(returns => DashboardCardItem, { description: 'Copies a card one may use into a card of one\\'s own, placed on one\\'s dashboard.' })\n async copyDashboardCard(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<DashboardCardItem> {\n const { domain, user, tx } = context.state as any\n const { card } = await usableCard(id, context, tx)\n const copy = await getRepository(DashboardCard, tx).save({ domain, name: card.name, description: card.description, owner: user, version: 1, definitionJson: card.definitionJson, copiedFromId: card.id, creator: user, updater: user } as any)\n await getRepository(DashboardCardVersion, tx).save({ domain, card: { id: copy.id }, version: 1, name: copy.name, definitionJson: copy.definitionJson, creator: user, updater: user } as any)\n await placeAtEnd(copy.id, context, tx)\n return (await itemsOf([copy], context))[0]\n }\n\n @Directive(MUTATION)\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: \"Deletes one's own card - its versions, shares and every place it was put.\" })\n async deleteDashboardCard(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { tx } = context.state as any\n const card = await ownCard(id, context, tx)\n for (const entity of [DashboardCardPlace, DashboardCardShare, DashboardCardVersion] as any[]) {\n const rows = await getRepository(entity, tx).find({ where: { card: { id: card.id } } as any })\n if (rows.length) await getRepository(entity, tx).softRemove(rows)\n }\n await getRepository(DashboardCard, tx).softRemove(card)\n return true\n }\n\n @Directive(MUTATION)\n @Directive('@transaction')\n @Mutation(returns => DashboardCardItem, { description: \"Sets who one's own card is shared with - the whole list; none keeps it to oneself. A share gives the definition, never the data.\" })\n async shareDashboardCard(@Arg('id') id: string, @Arg('shares', type => [DashboardCardShareInput]) shares: DashboardCardShareInput[], @Ctx() context: ResolverContext): Promise<DashboardCardItem> {\n const { domain, user, tx } = context.state as any\n const card = await ownCard(id, context, tx)\n const roleIds = (shares ?? []).some(one => one.scope === DashboardCardShareScope.ROLE) ? (await domainRolesOf(domain, undefined, tx)).map(one => one.id) : []\n const departmentIds = (shares ?? []).some(one => one.scope === DashboardCardShareScope.DEPARTMENT) ? [...(await departmentTreeOf(domain, tx)).keys()] : []\n const wanted = new Map<string, DashboardCardShareInput>()\n for (const share of shares ?? []) {\n const refusal = audienceTargetRefusal(share, { domainId: domain.id, departmentIds, roleIds })\n if (refusal) refuse(context, `share-${refusal}`, 'this share cannot be given ({code}).', { code: refusal })\n if (share.scope === DashboardCardShareScope.USER && share.targetId === user.id) continue\n wanted.set(`${share.scope}:${share.targetId}`, share)\n }\n const repository = getRepository(DashboardCardShare, tx)\n const current = await repository.find({ where: { card: { id: card.id } } as any })\n const gone = current.filter(one => !wanted.has(`${one.scope}:${one.targetId}`))\n if (gone.length) await repository.softRemove(gone)\n for (const [key, share] of wanted) {\n if (current.some(one => `${one.scope}:${one.targetId}` === key)) continue\n await repository.save({ domain, card: { id: card.id }, scope: share.scope, targetId: share.targetId, targetName: share.targetName?.slice(0, 100), creator: user, updater: user } as any)\n }\n return (await itemsOf([card], context))[0]\n }\n\n @Directive(MUTATION)\n @Directive('@transaction')\n @Mutation(returns => DashboardPlaceItem, { description: \"Places a card one may use at the end of one's dashboard.\" })\n async placeDashboardCard(@Arg('cardId') cardId: string, @Ctx() context: ResolverContext): Promise<DashboardPlaceItem> {\n const { tx } = context.state as any\n const { card } = await usableCard(cardId, context, tx)\n const place = await placeAtEnd(card.id, context, tx)\n return { id: place.id, order: place.order, width: place.width, height: place.height, card: (await itemsOf([card], context))[0] }\n }\n\n @Directive(MUTATION)\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: \"Takes a card off one's dashboard - the card stays in the library.\" })\n async removeDashboardPlace(@Arg('id') id: string, @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, user, tx } = context.state as any\n const place = await getRepository(DashboardCardPlace, tx).findOne({ where: { id, domain: { id: domain.id }, user: { id: user.id } } as any })\n if (!place) refuse(context, 'unknown-place', 'that card is not on your dashboard.')\n await getRepository(DashboardCardPlace, tx).softRemove(place)\n return true\n }\n\n @Directive(MUTATION)\n @Directive('@transaction')\n @Mutation(returns => Boolean, { description: \"Sets the order and size of the cards on one's dashboard.\" })\n async arrangeDashboard(@Arg('places', type => [DashboardPlaceInput]) places: DashboardPlaceInput[], @Ctx() context: ResolverContext): Promise<boolean> {\n const { domain, user, tx } = context.state as any\n const repository = getRepository(DashboardCardPlace, tx)\n const mine = await repository.find({ where: { domain: { id: domain.id }, user: { id: user.id } } as any })\n for (const given of places ?? []) {\n const place = mine.find(one => one.id === given.id)\n if (!place) refuse(context, 'unknown-place', 'that card is not on your dashboard.')\n if (!(given.width >= 1 && given.width <= MAX_WIDTH && given.height >= 1 && given.height <= MAX_HEIGHT)) refuse(context, 'size-out-of-range', 'a card spans 1 to 4 columns and 1 to 2 rows.')\n await repository.save({ ...place, order: given.order, width: given.width, height: given.height, updater: user } as any)\n }\n return true\n }\n}\n\n/** The conversation's messages that carry proposals, oldest first. */\nasync function proposalMessages(sessionId: string, tx?: any): Promise<{ proposals: any[] }[]> {\n const carrying = await getRepository(ChatMessage, tx).find({\n select: ['id', 'proposals', 'createdAt'] as any,\n where: { session: { id: sessionId } as any, proposals: Not(IsNull()) } as any,\n order: { createdAt: 'ASC' } as any\n })\n return carrying.map((message: any) => ({ proposals: message.proposalsJson ?? [] }))\n}\n\nexport { CARD_SCHEMA_VERSION }\n"]}
@@ -14,6 +14,8 @@ export interface CardRunDeps {
14
14
  run: Runner;
15
15
  /** Today in the domain's time zone - `YYYY-MM-DD`. */
16
16
  today: string;
17
+ /** The domain's time zone - a moment in the rows is read in it. */
18
+ timeZone?: string;
17
19
  /** The reader's words for a label key. */
18
20
  words?(key: string | undefined, fallback: string): string;
19
21
  }