@fabriktor/fx 0.0.145 → 0.0.146

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.
@@ -0,0 +1,9 @@
1
+ import type { User } from "@fabriktor/schema";
2
+ import type { EmploymentActor } from "../contacts/scope.js";
3
+ export type ChatFormRecipient = Pick<User, "id" | "account_identity">;
4
+ export type ChatFormPolicy = {
5
+ readonly sender_modes: readonly User["active_mode"][];
6
+ readonly recipient_identities: readonly User["account_identity"][];
7
+ readonly allow_group: boolean;
8
+ };
9
+ export declare function canSendChatForm(policy: ChatFormPolicy, actor: EmploymentActor, recipients: readonly ChatFormRecipient[]): boolean;
@@ -0,0 +1,15 @@
1
+ import { normalizeIDs, resolvedID } from "../core/id.js";
2
+ import { isFabriktorUser } from "../users/users.js";
3
+ // Recipients are all other members of the conversation, resolved before use.
4
+ // Recipient eligibility uses account identity, never their transient active mode.
5
+ export function canSendChatForm(policy, actor, recipients) {
6
+ return (!!resolvedID(actor.owner_id) &&
7
+ policy.sender_modes.includes(actor.active_mode) &&
8
+ recipients.length > 0 &&
9
+ (policy.allow_group || recipients.length === 1) &&
10
+ normalizeIDs(recipients.map((recipient) => recipient.id)).length ===
11
+ recipients.length &&
12
+ recipients.every((recipient) => recipient.id !== actor.owner_id &&
13
+ isFabriktorUser(recipient) &&
14
+ policy.recipient_identities.includes(recipient.account_identity)));
15
+ }
@@ -3,6 +3,7 @@ export * from "./billable/billable.js";
3
3
  export * from "./calls/calls.js";
4
4
  export * from "./chat/chat.js";
5
5
  export * from "./chat/data.js";
6
+ export * from "./chat/forms.js";
6
7
  export * from "./chat/optimistic.js";
7
8
  export * from "./chat/send-queue.js";
8
9
  export * from "./contacts/contacts.js";
package/dist/src/index.js CHANGED
@@ -3,6 +3,7 @@ export * from "./billable/billable.js";
3
3
  export * from "./calls/calls.js";
4
4
  export * from "./chat/chat.js";
5
5
  export * from "./chat/data.js";
6
+ export * from "./chat/forms.js";
6
7
  export * from "./chat/optimistic.js";
7
8
  export * from "./chat/send-queue.js";
8
9
  export * from "./contacts/contacts.js";
@@ -2,8 +2,14 @@ import type { JobsOperator, RoutesOperator, UsersOperator } from "@fabriktor/cli
2
2
  import { type ClientAvailability, type InClientAvailability, type Location, type PrefCompany, type User } from "@fabriktor/schema";
3
3
  import type { PreferencesFXOperator } from "../preferences/preferences.js";
4
4
  import { type ChatData } from "../chat/data.js";
5
+ import { type ChatFormRecipient } from "../chat/forms.js";
5
6
  import { type RoutesActor } from "./workspace.js";
6
7
  export declare const clientAvailabilityMinimumWindows = 3;
8
+ export declare const availabilityRequestPolicy: {
9
+ readonly sender_modes: readonly ["employer"];
10
+ readonly recipient_identities: readonly ["client"];
11
+ readonly allow_group: false;
12
+ };
7
13
  export declare const RoutesChatDataType: {
8
14
  readonly AvailabilityRequest: "routes.availability.request";
9
15
  readonly AvailabilitySubmitted: "routes.availability.submitted";
@@ -25,6 +31,7 @@ export type AvailabilityReaders = {
25
31
  };
26
32
  export declare function availabilityReference(data: ChatData): AvailabilityReference | undefined;
27
33
  export declare function availabilityRequest(location: Location, actor: RoutesActor): ChatData;
34
+ export declare function canSendAvailabilityRequest(data: ChatData, actor: RoutesActor, recipients: readonly ChatFormRecipient[]): boolean;
28
35
  export declare function availabilitySubmission(reference: AvailabilityReference, request_id: string, ids: readonly string[]): ChatData;
29
36
  export declare function loadAvailabilityContext(readers: AvailabilityReaders, actor: RoutesActor, reference: AvailabilityReference, signal?: AbortSignal): Promise<AvailabilityContext>;
30
37
  export declare function validateAvailabilityWindows(inputs: readonly InClientAvailability[], context: AvailabilityContext, minimum?: number): void;
@@ -5,9 +5,15 @@ import { hoursPerDay, minutesOfDay, minutesPerHour, sameCalendarDay, } from "../
5
5
  import { errValidation } from "../core/err.js";
6
6
  import { normalizeIDs, resolvedID } from "../core/id.js";
7
7
  import { newChatData } from "../chat/data.js";
8
+ import { canSendChatForm, } from "../chat/forms.js";
8
9
  import { routeCanPlan } from "./workspace.js";
9
10
  import { validateClientAvailabilityInput } from "./validation.js";
10
11
  export const clientAvailabilityMinimumWindows = 3;
12
+ export const availabilityRequestPolicy = {
13
+ sender_modes: [UserTypeEmployer],
14
+ recipient_identities: [UserTypeClient],
15
+ allow_group: false,
16
+ };
11
17
  export const RoutesChatDataType = {
12
18
  AvailabilityRequest: "routes.availability.request",
13
19
  AvailabilitySubmitted: "routes.availability.submitted",
@@ -55,6 +61,14 @@ export function availabilityRequest(location, actor) {
55
61
  location_id: location.id,
56
62
  });
57
63
  }
64
+ export function canSendAvailabilityRequest(data, actor, recipients) {
65
+ const reference = availabilityReference(data);
66
+ return (data.type === RoutesChatDataType.AvailabilityRequest &&
67
+ !!reference &&
68
+ reference.employer_id === actor.owner_id &&
69
+ canSendChatForm(availabilityRequestPolicy, actor, recipients) &&
70
+ reference.client_id === recipients[0].id);
71
+ }
58
72
  export function availabilitySubmission(reference, request_id, ids) {
59
73
  const data = newChatData(RoutesChatDataType.AvailabilitySubmitted, {
60
74
  ...reference,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fabriktor/fx",
3
- "version": "0.0.145",
3
+ "version": "0.0.146",
4
4
  "description": "![Fabriktor Logo](./img/fabriktor-character.gif)",
5
5
  "type": "module",
6
6
  "exports": {