@iveri/contracts 0.55.0 → 0.60.0

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 (49) hide show
  1. package/dist/api/realtime/realtime-event-type.enum.d.ts +4 -0
  2. package/dist/api/realtime/realtime-event-type.enum.js +4 -0
  3. package/dist/api/realtime/realtime-resource-type.enum.d.ts +5 -0
  4. package/dist/api/realtime/realtime-resource-type.enum.js +5 -0
  5. package/dist/api/social/index.d.ts +20 -0
  6. package/dist/api/social/index.js +20 -0
  7. package/dist/api/social/social-account.type.d.ts +24 -0
  8. package/dist/api/social/social-account.type.js +1 -0
  9. package/dist/api/social/social-activity-kind.enum.d.ts +13 -0
  10. package/dist/api/social/social-activity-kind.enum.js +14 -0
  11. package/dist/api/social/social-activity.type.d.ts +26 -0
  12. package/dist/api/social/social-activity.type.js +1 -0
  13. package/dist/api/social/social-appeal-status.enum.d.ts +7 -0
  14. package/dist/api/social/social-appeal-status.enum.js +8 -0
  15. package/dist/api/social/social-case-decision.enum.d.ts +13 -0
  16. package/dist/api/social/social-case-decision.enum.js +14 -0
  17. package/dist/api/social/social-case-status.enum.d.ts +4 -0
  18. package/dist/api/social/social-case-status.enum.js +5 -0
  19. package/dist/api/social/social-conversation.type.d.ts +45 -0
  20. package/dist/api/social/social-conversation.type.js +1 -0
  21. package/dist/api/social/social-export-status.enum.d.ts +6 -0
  22. package/dist/api/social/social-export-status.enum.js +7 -0
  23. package/dist/api/social/social-follow-state.enum.d.ts +7 -0
  24. package/dist/api/social/social-follow-state.enum.js +8 -0
  25. package/dist/api/social/social-image.type.d.ts +28 -0
  26. package/dist/api/social/social-image.type.js +1 -0
  27. package/dist/api/social/social-limits.constant.d.ts +23 -0
  28. package/dist/api/social/social-limits.constant.js +23 -0
  29. package/dist/api/social/social-member-status.enum.d.ts +12 -0
  30. package/dist/api/social/social-member-status.enum.js +13 -0
  31. package/dist/api/social/social-member.type.d.ts +79 -0
  32. package/dist/api/social/social-member.type.js +1 -0
  33. package/dist/api/social/social-moderation-reason.enum.d.ts +13 -0
  34. package/dist/api/social/social-moderation-reason.enum.js +14 -0
  35. package/dist/api/social/social-moderation.type.d.ts +166 -0
  36. package/dist/api/social/social-moderation.type.js +1 -0
  37. package/dist/api/social/social-post.type.d.ts +58 -0
  38. package/dist/api/social/social-post.type.js +1 -0
  39. package/dist/api/social/social-refusal.enum.d.ts +37 -0
  40. package/dist/api/social/social-refusal.enum.js +38 -0
  41. package/dist/api/social/social-report-reason.enum.d.ts +18 -0
  42. package/dist/api/social/social-report-reason.enum.js +19 -0
  43. package/dist/api/social/social-report-target.enum.d.ts +8 -0
  44. package/dist/api/social/social-report-target.enum.js +9 -0
  45. package/dist/api/social/social-story.type.d.ts +30 -0
  46. package/dist/api/social/social-story.type.js +1 -0
  47. package/dist/enum/user-permission.enum.d.ts +12 -0
  48. package/dist/enum/user-permission.enum.js +12 -0
  49. package/package.json +5 -1
@@ -32,6 +32,10 @@ export declare enum RealtimeEventType {
32
32
  RESTAURANT_BRANCH_UPDATED = "restaurant.branch.updated",
33
33
  /** One diner's order moved. */
34
34
  RESTAURANT_ORDER_UPDATED = "restaurant.order.updated",
35
+ /** A member's conversations changed, so their inbox is stale. */
36
+ SOCIAL_INBOX_UPDATED = "social.inbox.updated",
37
+ /** Something new happened to a member, so their activity list and its count are stale. */
38
+ SOCIAL_ACTIVITY_UPDATED = "social.activity.updated",
35
39
  /** Somebody came through a branch's door or a class changed, so staff screens refetch. */
36
40
  GYM_BRANCH_UPDATED = "gym.branch.updated"
37
41
  }
@@ -33,6 +33,10 @@ export var RealtimeEventType;
33
33
  RealtimeEventType["RESTAURANT_BRANCH_UPDATED"] = "restaurant.branch.updated";
34
34
  /** One diner's order moved. */
35
35
  RealtimeEventType["RESTAURANT_ORDER_UPDATED"] = "restaurant.order.updated";
36
+ /** A member's conversations changed, so their inbox is stale. */
37
+ RealtimeEventType["SOCIAL_INBOX_UPDATED"] = "social.inbox.updated";
38
+ /** Something new happened to a member, so their activity list and its count are stale. */
39
+ RealtimeEventType["SOCIAL_ACTIVITY_UPDATED"] = "social.activity.updated";
36
40
  /** Somebody came through a branch's door or a class changed, so staff screens refetch. */
37
41
  RealtimeEventType["GYM_BRANCH_UPDATED"] = "gym.branch.updated";
38
42
  })(RealtimeEventType || (RealtimeEventType = {}));
@@ -11,5 +11,10 @@ export declare enum RealtimeResourceType {
11
11
  MOBILITY_DISPATCH = "mobility.dispatch",
12
12
  RESTAURANT_BRANCH = "restaurant.branch",
13
13
  RESTAURANT_ORDER = "restaurant.order",
14
+ /**
15
+ * One Ezo member's own room. They subscribe to themselves, the one thing they can name before a
16
+ * message or a like has happened, and the events on it say what became stale.
17
+ */
18
+ SOCIAL_MEMBER = "social.member",
14
19
  GYM_BRANCH = "gym.branch"
15
20
  }
@@ -12,5 +12,10 @@ export var RealtimeResourceType;
12
12
  RealtimeResourceType["MOBILITY_DISPATCH"] = "mobility.dispatch";
13
13
  RealtimeResourceType["RESTAURANT_BRANCH"] = "restaurant.branch";
14
14
  RealtimeResourceType["RESTAURANT_ORDER"] = "restaurant.order";
15
+ /**
16
+ * One Ezo member's own room. They subscribe to themselves, the one thing they can name before a
17
+ * message or a like has happened, and the events on it say what became stale.
18
+ */
19
+ RealtimeResourceType["SOCIAL_MEMBER"] = "social.member";
15
20
  RealtimeResourceType["GYM_BRANCH"] = "gym.branch";
16
21
  })(RealtimeResourceType || (RealtimeResourceType = {}));
@@ -0,0 +1,20 @@
1
+ export * from './social-account.type.js';
2
+ export * from './social-activity-kind.enum.js';
3
+ export * from './social-activity.type.js';
4
+ export * from './social-appeal-status.enum.js';
5
+ export * from './social-case-decision.enum.js';
6
+ export * from './social-case-status.enum.js';
7
+ export * from './social-conversation.type.js';
8
+ export * from './social-export-status.enum.js';
9
+ export * from './social-follow-state.enum.js';
10
+ export * from './social-image.type.js';
11
+ export * from './social-limits.constant.js';
12
+ export * from './social-member-status.enum.js';
13
+ export * from './social-member.type.js';
14
+ export * from './social-moderation-reason.enum.js';
15
+ export * from './social-moderation.type.js';
16
+ export * from './social-post.type.js';
17
+ export * from './social-refusal.enum.js';
18
+ export * from './social-report-reason.enum.js';
19
+ export * from './social-report-target.enum.js';
20
+ export * from './social-story.type.js';
@@ -0,0 +1,20 @@
1
+ export * from './social-account.type.js';
2
+ export * from './social-activity-kind.enum.js';
3
+ export * from './social-activity.type.js';
4
+ export * from './social-appeal-status.enum.js';
5
+ export * from './social-case-decision.enum.js';
6
+ export * from './social-case-status.enum.js';
7
+ export * from './social-conversation.type.js';
8
+ export * from './social-export-status.enum.js';
9
+ export * from './social-follow-state.enum.js';
10
+ export * from './social-image.type.js';
11
+ export * from './social-limits.constant.js';
12
+ export * from './social-member-status.enum.js';
13
+ export * from './social-member.type.js';
14
+ export * from './social-moderation-reason.enum.js';
15
+ export * from './social-moderation.type.js';
16
+ export * from './social-post.type.js';
17
+ export * from './social-refusal.enum.js';
18
+ export * from './social-report-reason.enum.js';
19
+ export * from './social-report-target.enum.js';
20
+ export * from './social-story.type.js';
@@ -0,0 +1,24 @@
1
+ import type { IsoDateTime } from '../../type/iso-date-time.type.js';
2
+ import type { Nullable } from '../../type/nil.type.js';
3
+ import type { UUID } from '../../type/uuid.type.js';
4
+ import type { SocialExportStatus } from './social-export-status.enum.js';
5
+ export interface SocialDeletionState {
6
+ deletionScheduledFor: Nullable<IsoDateTime>;
7
+ }
8
+ export interface SocialDataExport {
9
+ id: UUID;
10
+ status: SocialExportStatus;
11
+ requestedAt: IsoDateTime;
12
+ readyAt: Nullable<IsoDateTime>;
13
+ expiresAt: Nullable<IsoDateTime>;
14
+ downloadUrl: Nullable<string>;
15
+ sizeBytes: Nullable<number>;
16
+ }
17
+ export interface ConfirmSocialEmailRequest {
18
+ token: string;
19
+ }
20
+ export interface SocialRealtimeGrant {
21
+ grant: string;
22
+ expiresAt: IsoDateTime;
23
+ memberId: UUID;
24
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,13 @@
1
+ /** What happened, for one line of a member's activity. */
2
+ export declare enum SocialActivityKind {
3
+ POST_LIKED = "post-liked",
4
+ COMMENT_LIKED = "comment-liked",
5
+ POST_COMMENTED = "post-commented",
6
+ COMMENT_REPLIED = "comment-replied",
7
+ MENTIONED = "mentioned",
8
+ FOLLOWED = "followed",
9
+ FOLLOW_REQUESTED = "follow-requested",
10
+ FOLLOW_ACCEPTED = "follow-accepted",
11
+ /** Staff decided something about this member or what they posted. */
12
+ MODERATION_NOTICE = "moderation-notice"
13
+ }
@@ -0,0 +1,14 @@
1
+ /** What happened, for one line of a member's activity. */
2
+ export var SocialActivityKind;
3
+ (function (SocialActivityKind) {
4
+ SocialActivityKind["POST_LIKED"] = "post-liked";
5
+ SocialActivityKind["COMMENT_LIKED"] = "comment-liked";
6
+ SocialActivityKind["POST_COMMENTED"] = "post-commented";
7
+ SocialActivityKind["COMMENT_REPLIED"] = "comment-replied";
8
+ SocialActivityKind["MENTIONED"] = "mentioned";
9
+ SocialActivityKind["FOLLOWED"] = "followed";
10
+ SocialActivityKind["FOLLOW_REQUESTED"] = "follow-requested";
11
+ SocialActivityKind["FOLLOW_ACCEPTED"] = "follow-accepted";
12
+ /** Staff decided something about this member or what they posted. */
13
+ SocialActivityKind["MODERATION_NOTICE"] = "moderation-notice";
14
+ })(SocialActivityKind || (SocialActivityKind = {}));
@@ -0,0 +1,26 @@
1
+ import type { IsoDateTime } from '../../type/iso-date-time.type.js';
2
+ import type { Nullable } from '../../type/nil.type.js';
3
+ import type { UUID } from '../../type/uuid.type.js';
4
+ import type { SocialActivityKind } from './social-activity-kind.enum.js';
5
+ import type { SocialMemberCard } from './social-member.type.js';
6
+ /** One line of activity, which can stand for many people doing the same thing. */
7
+ export interface SocialActivityItem {
8
+ id: UUID;
9
+ kind: SocialActivityKind;
10
+ /** The most recent few, for drawing faces and names. */
11
+ actors: SocialMemberCard[];
12
+ actorCount: number;
13
+ postId: Nullable<UUID>;
14
+ postThumbnailUrl: Nullable<string>;
15
+ commentId: Nullable<UUID>;
16
+ excerpt: Nullable<string>;
17
+ /** For a moderation notice, the decision it announces. */
18
+ noticeId: Nullable<UUID>;
19
+ latestAt: IsoDateTime;
20
+ isRead: boolean;
21
+ }
22
+ export interface SocialUnreadCounts {
23
+ activity: number;
24
+ messages: number;
25
+ followRequests: number;
26
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,7 @@
1
+ export declare enum SocialAppealStatus {
2
+ PENDING = "pending",
3
+ /** The decision stands. */
4
+ UPHELD = "upheld",
5
+ /** The decision was wrong, and what it did has been undone. */
6
+ REVERSED = "reversed"
7
+ }
@@ -0,0 +1,8 @@
1
+ export var SocialAppealStatus;
2
+ (function (SocialAppealStatus) {
3
+ SocialAppealStatus["PENDING"] = "pending";
4
+ /** The decision stands. */
5
+ SocialAppealStatus["UPHELD"] = "upheld";
6
+ /** The decision was wrong, and what it did has been undone. */
7
+ SocialAppealStatus["REVERSED"] = "reversed";
8
+ })(SocialAppealStatus || (SocialAppealStatus = {}));
@@ -0,0 +1,13 @@
1
+ /** What a moderator decided about a case. */
2
+ export declare enum SocialCaseDecision {
3
+ /** Nothing was wrong. */
4
+ DISMISS = "dismiss",
5
+ /** The content comes down and the member is told why. */
6
+ REMOVE = "remove",
7
+ /** The content comes down and it goes on the member's record as a warning. */
8
+ WARN = "warn",
9
+ /** The content comes down and the member cannot use Ezo until a date. */
10
+ SUSPEND = "suspend",
11
+ /** The content comes down and the member cannot use Ezo at all. */
12
+ BAN = "ban"
13
+ }
@@ -0,0 +1,14 @@
1
+ /** What a moderator decided about a case. */
2
+ export var SocialCaseDecision;
3
+ (function (SocialCaseDecision) {
4
+ /** Nothing was wrong. */
5
+ SocialCaseDecision["DISMISS"] = "dismiss";
6
+ /** The content comes down and the member is told why. */
7
+ SocialCaseDecision["REMOVE"] = "remove";
8
+ /** The content comes down and it goes on the member's record as a warning. */
9
+ SocialCaseDecision["WARN"] = "warn";
10
+ /** The content comes down and the member cannot use Ezo until a date. */
11
+ SocialCaseDecision["SUSPEND"] = "suspend";
12
+ /** The content comes down and the member cannot use Ezo at all. */
13
+ SocialCaseDecision["BAN"] = "ban";
14
+ })(SocialCaseDecision || (SocialCaseDecision = {}));
@@ -0,0 +1,4 @@
1
+ export declare enum SocialCaseStatus {
2
+ OPEN = "open",
3
+ RESOLVED = "resolved"
4
+ }
@@ -0,0 +1,5 @@
1
+ export var SocialCaseStatus;
2
+ (function (SocialCaseStatus) {
3
+ SocialCaseStatus["OPEN"] = "open";
4
+ SocialCaseStatus["RESOLVED"] = "resolved";
5
+ })(SocialCaseStatus || (SocialCaseStatus = {}));
@@ -0,0 +1,45 @@
1
+ import type { IsoDateTime } from '../../type/iso-date-time.type.js';
2
+ import type { Nullable } from '../../type/nil.type.js';
3
+ import type { UUID } from '../../type/uuid.type.js';
4
+ import type { SocialImage } from './social-image.type.js';
5
+ import type { SocialMemberCard } from './social-member.type.js';
6
+ export interface SocialMessagePreview {
7
+ excerpt: Nullable<string>;
8
+ hasImage: boolean;
9
+ isOwn: boolean;
10
+ sentAt: IsoDateTime;
11
+ }
12
+ export interface SocialConversation {
13
+ id: UUID;
14
+ /** Null once the other person has left Ezo. */
15
+ other: Nullable<SocialMemberCard>;
16
+ /** Waiting for this member to accept it. */
17
+ isRequest: boolean;
18
+ unreadCount: number;
19
+ lastMessage: Nullable<SocialMessagePreview>;
20
+ /** Whether this member can send here now: false after a block or when the other has left. */
21
+ canSend: boolean;
22
+ /** Up to where the other person has read. Absent while a request is unanswered. */
23
+ otherReadAt: Nullable<IsoDateTime>;
24
+ }
25
+ export interface SocialMessage {
26
+ id: UUID;
27
+ conversationId: UUID;
28
+ /** Null once the sender has left Ezo. */
29
+ senderId: Nullable<UUID>;
30
+ body: Nullable<string>;
31
+ image: Nullable<SocialImage>;
32
+ isOwn: boolean;
33
+ /** The sender took it back. */
34
+ isDeleted: boolean;
35
+ sentAt: IsoDateTime;
36
+ }
37
+ export interface StartSocialConversationRequest {
38
+ memberId: UUID;
39
+ }
40
+ export interface SendSocialMessageRequest {
41
+ /** Chosen by the client per message, so a retry cannot send it twice. */
42
+ clientId: UUID;
43
+ body?: Nullable<string>;
44
+ mediaId?: Nullable<UUID>;
45
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,6 @@
1
+ export declare enum SocialExportStatus {
2
+ PENDING = "pending",
3
+ READY = "ready",
4
+ FAILED = "failed",
5
+ EXPIRED = "expired"
6
+ }
@@ -0,0 +1,7 @@
1
+ export var SocialExportStatus;
2
+ (function (SocialExportStatus) {
3
+ SocialExportStatus["PENDING"] = "pending";
4
+ SocialExportStatus["READY"] = "ready";
5
+ SocialExportStatus["FAILED"] = "failed";
6
+ SocialExportStatus["EXPIRED"] = "expired";
7
+ })(SocialExportStatus || (SocialExportStatus = {}));
@@ -0,0 +1,7 @@
1
+ /** One direction of the follow graph, as one member sees it. */
2
+ export declare enum SocialFollowState {
3
+ NONE = "none",
4
+ /** Waiting for a private account to answer. */
5
+ REQUESTED = "requested",
6
+ FOLLOWING = "following"
7
+ }
@@ -0,0 +1,8 @@
1
+ /** One direction of the follow graph, as one member sees it. */
2
+ export var SocialFollowState;
3
+ (function (SocialFollowState) {
4
+ SocialFollowState["NONE"] = "none";
5
+ /** Waiting for a private account to answer. */
6
+ SocialFollowState["REQUESTED"] = "requested";
7
+ SocialFollowState["FOLLOWING"] = "following";
8
+ })(SocialFollowState || (SocialFollowState = {}));
@@ -0,0 +1,28 @@
1
+ import type { Nullable } from '../../type/nil.type.js';
2
+ import type { UUID } from '../../type/uuid.type.js';
3
+ /** Addresses of one photograph. Signed, and only good for about two hours after the response. */
4
+ export interface SocialImageUrls {
5
+ /** 320 wide. */
6
+ small: string;
7
+ /** 800 wide. */
8
+ medium: string;
9
+ /** 1600 wide. */
10
+ large: string;
11
+ }
12
+ export interface SocialImage {
13
+ id: UUID;
14
+ width: number;
15
+ height: number;
16
+ /** A solid colour to paint while the photograph loads. */
17
+ placeholderColor: string;
18
+ altText: Nullable<string>;
19
+ urls: SocialImageUrls;
20
+ }
21
+ /** What an upload answers, before anything has used it. */
22
+ export interface SocialMediaUpload {
23
+ id: UUID;
24
+ width: number;
25
+ height: number;
26
+ placeholderColor: string;
27
+ previewUrl: string;
28
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,23 @@
1
+ /** Limits a form and the API have to agree on. */
2
+ export declare const SOCIAL_LIMITS: {
3
+ readonly HANDLE_MIN: 3;
4
+ readonly HANDLE_MAX: 30;
5
+ readonly DISPLAY_NAME_MAX: 60;
6
+ readonly BIO_MAX: 300;
7
+ readonly WEBSITE_MAX: 300;
8
+ readonly CAPTION_MAX: 2200;
9
+ readonly COMMENT_MAX: 1000;
10
+ readonly STORY_CAPTION_MAX: 200;
11
+ readonly MESSAGE_MAX: 2000;
12
+ readonly ALT_TEXT_MAX: 500;
13
+ readonly POST_IMAGES_MAX: 10;
14
+ readonly REPORT_DETAIL_MAX: 1000;
15
+ readonly APPEAL_STATEMENT_MAX: 2000;
16
+ readonly MODERATION_NOTE_MAX: 2000;
17
+ readonly IMAGE_BYTES_MAX: number;
18
+ readonly MINIMUM_AGE: 16;
19
+ };
20
+ /** The characters a handle may use, in the form they are stored. */
21
+ export declare const SOCIAL_HANDLE_PATTERN: RegExp;
22
+ /** The version of the terms a new member accepts. A placeholder until the real terms exist. */
23
+ export declare const SOCIAL_TERMS_VERSION = "2026-11-draft";
@@ -0,0 +1,23 @@
1
+ /** Limits a form and the API have to agree on. */
2
+ export const SOCIAL_LIMITS = {
3
+ HANDLE_MIN: 3,
4
+ HANDLE_MAX: 30,
5
+ DISPLAY_NAME_MAX: 60,
6
+ BIO_MAX: 300,
7
+ WEBSITE_MAX: 300,
8
+ CAPTION_MAX: 2200,
9
+ COMMENT_MAX: 1000,
10
+ STORY_CAPTION_MAX: 200,
11
+ MESSAGE_MAX: 2000,
12
+ ALT_TEXT_MAX: 500,
13
+ POST_IMAGES_MAX: 10,
14
+ REPORT_DETAIL_MAX: 1000,
15
+ APPEAL_STATEMENT_MAX: 2000,
16
+ MODERATION_NOTE_MAX: 2000,
17
+ IMAGE_BYTES_MAX: 15 * 1024 * 1024,
18
+ MINIMUM_AGE: 16,
19
+ };
20
+ /** The characters a handle may use, in the form they are stored. */
21
+ export const SOCIAL_HANDLE_PATTERN = /^[a-z0-9](?:[a-z0-9._]*[a-z0-9])?$/;
22
+ /** The version of the terms a new member accepts. A placeholder until the real terms exist. */
23
+ export const SOCIAL_TERMS_VERSION = '2026-11-draft';
@@ -0,0 +1,12 @@
1
+ /**
2
+ * Whether a member can use Ezo.
3
+ *
4
+ * `deleting` is the grace period after somebody asks to leave: the account is already invisible to
5
+ * everyone else, and signing in during it cancels the request.
6
+ */
7
+ export declare enum SocialMemberStatus {
8
+ ACTIVE = "active",
9
+ SUSPENDED = "suspended",
10
+ BANNED = "banned",
11
+ DELETING = "deleting"
12
+ }
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Whether a member can use Ezo.
3
+ *
4
+ * `deleting` is the grace period after somebody asks to leave: the account is already invisible to
5
+ * everyone else, and signing in during it cancels the request.
6
+ */
7
+ export var SocialMemberStatus;
8
+ (function (SocialMemberStatus) {
9
+ SocialMemberStatus["ACTIVE"] = "active";
10
+ SocialMemberStatus["SUSPENDED"] = "suspended";
11
+ SocialMemberStatus["BANNED"] = "banned";
12
+ SocialMemberStatus["DELETING"] = "deleting";
13
+ })(SocialMemberStatus || (SocialMemberStatus = {}));
@@ -0,0 +1,79 @@
1
+ import type { IsoDateTime } from '../../type/iso-date-time.type.js';
2
+ import type { Nullable } from '../../type/nil.type.js';
3
+ import type { UUID } from '../../type/uuid.type.js';
4
+ import type { SocialFollowState } from './social-follow-state.enum.js';
5
+ import type { SocialMemberStatus } from './social-member-status.enum.js';
6
+ /** The smallest face of a person: what appears beside a post, a comment or a message. */
7
+ export interface SocialMemberCard {
8
+ id: UUID;
9
+ handle: string;
10
+ displayName: string;
11
+ avatarUrl: Nullable<string>;
12
+ isPrivate: boolean;
13
+ }
14
+ export interface SocialRelationship {
15
+ /** Whether the viewer follows this member. */
16
+ following: SocialFollowState;
17
+ /** Whether this member follows the viewer. */
18
+ followedBy: SocialFollowState;
19
+ isMuted: boolean;
20
+ isBlocked: boolean;
21
+ }
22
+ export interface SocialProfile extends SocialMemberCard {
23
+ bio: Nullable<string>;
24
+ websiteUrl: Nullable<string>;
25
+ followerCount: number;
26
+ followingCount: number;
27
+ postCount: number;
28
+ joinedAt: IsoDateTime;
29
+ isSelf: boolean;
30
+ /** Absent for your own profile and for a visitor with no account. */
31
+ relationship: Nullable<SocialRelationship>;
32
+ /** False for a private account the viewer does not follow, whose posts stay out of reach. */
33
+ canViewContent: boolean;
34
+ hasStory: boolean;
35
+ }
36
+ /** A member reading about themselves. */
37
+ export interface SocialMe extends SocialProfile {
38
+ status: SocialMemberStatus;
39
+ suspendedUntil: Nullable<IsoDateTime>;
40
+ /** The day this member turns 18. Absent for an adult. */
41
+ minorUntil: Nullable<string>;
42
+ isEmailConfirmed: boolean;
43
+ deletionScheduledFor: Nullable<IsoDateTime>;
44
+ acceptedTermsVersion: string;
45
+ unreadActivityCount: number;
46
+ unreadMessageCount: number;
47
+ }
48
+ export interface CreateSocialProfileRequest {
49
+ handle: string;
50
+ displayName: string;
51
+ /** `YYYY-MM-DD`. Checked and not stored. */
52
+ birthDate: string;
53
+ acceptedTermsVersion: string;
54
+ }
55
+ export interface UpdateSocialProfileRequest {
56
+ handle?: string;
57
+ displayName?: string;
58
+ bio?: Nullable<string>;
59
+ websiteUrl?: Nullable<string>;
60
+ isPrivate?: boolean;
61
+ }
62
+ export interface SocialHandleAvailability {
63
+ handle: string;
64
+ isAvailable: boolean;
65
+ }
66
+ /** One line of a followers list, a following list or a follow-request list. */
67
+ export interface SocialMemberListItem {
68
+ member: SocialMemberCard;
69
+ relationship: Nullable<SocialRelationship>;
70
+ since: IsoDateTime;
71
+ }
72
+ export interface SocialPreferences {
73
+ emailOnMessage: boolean;
74
+ emailOnFollow: boolean;
75
+ emailOnMention: boolean;
76
+ emailOnComment: boolean;
77
+ /** Whether somebody you do not follow can start a conversation at all. */
78
+ allowMessageRequests: boolean;
79
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,13 @@
1
+ /** The rule a moderator says was broken. Shown to the member in their own language. */
2
+ export declare enum SocialModerationReason {
3
+ SPAM = "spam",
4
+ HARASSMENT = "harassment",
5
+ HATE = "hate",
6
+ VIOLENCE = "violence",
7
+ NUDITY = "nudity",
8
+ CHILD_SAFETY = "child-safety",
9
+ SELF_HARM = "self-harm",
10
+ IMPERSONATION = "impersonation",
11
+ ILLEGAL = "illegal",
12
+ OTHER = "other"
13
+ }
@@ -0,0 +1,14 @@
1
+ /** The rule a moderator says was broken. Shown to the member in their own language. */
2
+ export var SocialModerationReason;
3
+ (function (SocialModerationReason) {
4
+ SocialModerationReason["SPAM"] = "spam";
5
+ SocialModerationReason["HARASSMENT"] = "harassment";
6
+ SocialModerationReason["HATE"] = "hate";
7
+ SocialModerationReason["VIOLENCE"] = "violence";
8
+ SocialModerationReason["NUDITY"] = "nudity";
9
+ SocialModerationReason["CHILD_SAFETY"] = "child-safety";
10
+ SocialModerationReason["SELF_HARM"] = "self-harm";
11
+ SocialModerationReason["IMPERSONATION"] = "impersonation";
12
+ SocialModerationReason["ILLEGAL"] = "illegal";
13
+ SocialModerationReason["OTHER"] = "other";
14
+ })(SocialModerationReason || (SocialModerationReason = {}));
@@ -0,0 +1,166 @@
1
+ import type { IsoDateTime } from '../../type/iso-date-time.type.js';
2
+ import type { Nullable } from '../../type/nil.type.js';
3
+ import type { UUID } from '../../type/uuid.type.js';
4
+ import type { SocialAppealStatus } from './social-appeal-status.enum.js';
5
+ import type { SocialCaseDecision } from './social-case-decision.enum.js';
6
+ import type { SocialCaseStatus } from './social-case-status.enum.js';
7
+ import type { SocialMemberStatus } from './social-member-status.enum.js';
8
+ import type { SocialMemberCard } from './social-member.type.js';
9
+ import type { SocialModerationReason } from './social-moderation-reason.enum.js';
10
+ import type { SocialReportReason } from './social-report-reason.enum.js';
11
+ import type { SocialReportTarget } from './social-report-target.enum.js';
12
+ export interface CreateSocialReportRequest {
13
+ targetType: SocialReportTarget;
14
+ targetId: UUID;
15
+ reason: SocialReportReason;
16
+ detail?: Nullable<string>;
17
+ }
18
+ /** A decision, as the member it was about reads it. */
19
+ export interface SocialNotice {
20
+ id: UUID;
21
+ decision: SocialCaseDecision;
22
+ reason: SocialModerationReason;
23
+ targetType: SocialReportTarget;
24
+ excerpt: Nullable<string>;
25
+ decidedAt: IsoDateTime;
26
+ suspendedUntil: Nullable<IsoDateTime>;
27
+ canAppeal: boolean;
28
+ appealStatus: Nullable<SocialAppealStatus>;
29
+ appealAnsweredAt: Nullable<IsoDateTime>;
30
+ }
31
+ export interface CreateSocialAppealRequest {
32
+ statement: string;
33
+ }
34
+ /** What was reported, frozen when the case opened. */
35
+ export interface SocialCaseEvidence {
36
+ text: Nullable<string>;
37
+ imageUrls: string[];
38
+ /** For a reported message, what came just before it, oldest first. */
39
+ context: SocialCaseMessageContext[];
40
+ createdAt: Nullable<IsoDateTime>;
41
+ }
42
+ export interface SocialCaseMessageContext {
43
+ senderHandle: Nullable<string>;
44
+ body: Nullable<string>;
45
+ sentAt: IsoDateTime;
46
+ }
47
+ export interface SocialCaseSummary {
48
+ id: UUID;
49
+ targetType: SocialReportTarget;
50
+ targetId: UUID;
51
+ status: SocialCaseStatus;
52
+ subject: Nullable<SocialMemberCard>;
53
+ excerpt: Nullable<string>;
54
+ topReason: SocialReportReason;
55
+ reportCount: number;
56
+ isUrgent: boolean;
57
+ claimedByMe: boolean;
58
+ claimedUntil: Nullable<IsoDateTime>;
59
+ openedAt: IsoDateTime;
60
+ lastReportedAt: IsoDateTime;
61
+ decision: Nullable<SocialCaseDecision>;
62
+ }
63
+ export interface SocialCaseReport {
64
+ id: UUID;
65
+ reporter: Nullable<SocialMemberCard>;
66
+ reason: SocialReportReason;
67
+ detail: Nullable<string>;
68
+ createdAt: IsoDateTime;
69
+ }
70
+ export interface SocialCaseAction {
71
+ id: UUID;
72
+ decision: SocialCaseDecision;
73
+ reason: SocialModerationReason;
74
+ note: Nullable<string>;
75
+ moderatorUserId: UUID;
76
+ suspendedUntil: Nullable<IsoDateTime>;
77
+ createdAt: IsoDateTime;
78
+ }
79
+ export interface SocialCaseDetail extends SocialCaseSummary {
80
+ evidence: SocialCaseEvidence;
81
+ reports: SocialCaseReport[];
82
+ actions: SocialCaseAction[];
83
+ subjectRecord: Nullable<SocialStaffMember>;
84
+ }
85
+ export interface DecideSocialCaseRequest {
86
+ decision: SocialCaseDecision;
87
+ reason: SocialModerationReason;
88
+ /** Staff only. The member is told the reason, never this. */
89
+ note?: Nullable<string>;
90
+ suspendDays?: Nullable<number>;
91
+ }
92
+ /** A member as staff see them. */
93
+ export interface SocialStaffMember extends SocialMemberCard {
94
+ status: SocialMemberStatus;
95
+ suspendedUntil: Nullable<IsoDateTime>;
96
+ isMinor: boolean;
97
+ bio: Nullable<string>;
98
+ followerCount: number;
99
+ followingCount: number;
100
+ postCount: number;
101
+ warningCount: number;
102
+ suspensionCount: number;
103
+ reportCount: number;
104
+ joinedAt: IsoDateTime;
105
+ }
106
+ export interface SocialStaffMemberDetail extends SocialStaffMember {
107
+ notices: SocialStaffNotice[];
108
+ }
109
+ export interface SocialStaffNotice extends SocialNotice {
110
+ caseId: UUID;
111
+ moderatorUserId: UUID;
112
+ note: Nullable<string>;
113
+ }
114
+ export interface SanctionSocialMemberRequest {
115
+ decision: SocialCaseDecision.SUSPEND | SocialCaseDecision.BAN;
116
+ reason: SocialModerationReason;
117
+ note?: Nullable<string>;
118
+ suspendDays?: Nullable<number>;
119
+ }
120
+ export interface SocialStaffAppeal {
121
+ id: UUID;
122
+ status: SocialAppealStatus;
123
+ statement: string;
124
+ member: Nullable<SocialMemberCard>;
125
+ notice: SocialStaffNotice;
126
+ /** The moderator who made the decision cannot answer this appeal. */
127
+ canDecide: boolean;
128
+ createdAt: IsoDateTime;
129
+ answeredAt: Nullable<IsoDateTime>;
130
+ answerNote: Nullable<string>;
131
+ }
132
+ export interface DecideSocialAppealRequest {
133
+ status: SocialAppealStatus.UPHELD | SocialAppealStatus.REVERSED;
134
+ note?: Nullable<string>;
135
+ }
136
+ export interface SocialModerationOverview {
137
+ openCases: number;
138
+ urgentCases: number;
139
+ pendingAppeals: number;
140
+ oldestOpenAt: Nullable<IsoDateTime>;
141
+ resolvedLast7Days: number;
142
+ reportsLast7Days: number;
143
+ membersTotal: number;
144
+ membersLast7Days: number;
145
+ postsLast7Days: number;
146
+ restrictedMembers: number;
147
+ reportsByReason: SocialReasonCount[];
148
+ reportsByDay: SocialDayCount[];
149
+ }
150
+ export interface SocialReasonCount {
151
+ reason: SocialReportReason;
152
+ count: number;
153
+ }
154
+ export interface SocialDayCount {
155
+ day: string;
156
+ count: number;
157
+ }
158
+ /** One line of the record of what staff looked at and did. */
159
+ export interface SocialStaffAuditEntry {
160
+ id: UUID;
161
+ staffUserId: UUID;
162
+ action: string;
163
+ caseId: Nullable<UUID>;
164
+ memberId: Nullable<UUID>;
165
+ createdAt: IsoDateTime;
166
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,58 @@
1
+ import type { IsoDateTime } from '../../type/iso-date-time.type.js';
2
+ import type { Nullable } from '../../type/nil.type.js';
3
+ import type { UUID } from '../../type/uuid.type.js';
4
+ import type { SocialImage } from './social-image.type.js';
5
+ import type { SocialMemberCard } from './social-member.type.js';
6
+ export interface SocialPost {
7
+ id: UUID;
8
+ author: SocialMemberCard;
9
+ caption: Nullable<string>;
10
+ images: SocialImage[];
11
+ commentsDisabled: boolean;
12
+ likeCount: number;
13
+ commentCount: number;
14
+ viewerLiked: boolean;
15
+ viewerSaved: boolean;
16
+ isOwn: boolean;
17
+ createdAt: IsoDateTime;
18
+ editedAt: Nullable<IsoDateTime>;
19
+ }
20
+ export interface CreateSocialPostMedia {
21
+ id: UUID;
22
+ altText?: Nullable<string>;
23
+ }
24
+ export interface CreateSocialPostRequest {
25
+ caption?: Nullable<string>;
26
+ media?: CreateSocialPostMedia[];
27
+ commentsDisabled?: boolean;
28
+ }
29
+ export interface UpdateSocialPostRequest {
30
+ caption?: Nullable<string>;
31
+ commentsDisabled?: boolean;
32
+ }
33
+ export interface SocialComment {
34
+ id: UUID;
35
+ postId: UUID;
36
+ parentId: Nullable<UUID>;
37
+ author: SocialMemberCard;
38
+ body: string;
39
+ likeCount: number;
40
+ replyCount: number;
41
+ viewerLiked: boolean;
42
+ isOwn: boolean;
43
+ /** The commenter and the post's author may both delete it. */
44
+ canDelete: boolean;
45
+ createdAt: IsoDateTime;
46
+ }
47
+ export interface CreateSocialCommentRequest {
48
+ body: string;
49
+ parentId?: Nullable<UUID>;
50
+ }
51
+ export interface SocialTag {
52
+ name: string;
53
+ postCount: number;
54
+ }
55
+ export interface SocialSearchResults {
56
+ members: SocialMemberCard[];
57
+ tags: SocialTag[];
58
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,37 @@
1
+ /**
2
+ * Why `social-api` refused something a member can do something about.
3
+ *
4
+ * Sent as `error.details.reason`. A site that shows Georgian to a Georgian reader cannot print the
5
+ * API's English sentence at them, so each of these is a key the site translates. The English
6
+ * `message` remains for a log line and for anything that does not know this list.
7
+ */
8
+ export declare enum SocialRefusal {
9
+ PROFILE_MISSING = "profile-missing",
10
+ PROFILE_EXISTS = "profile-exists",
11
+ HANDLE_TAKEN = "handle-taken",
12
+ HANDLE_RESERVED = "handle-reserved",
13
+ HANDLE_CHANGED_RECENTLY = "handle-changed-recently",
14
+ TOO_YOUNG = "too-young",
15
+ TERMS_OUTDATED = "terms-outdated",
16
+ SUSPENDED = "suspended",
17
+ BANNED = "banned",
18
+ DELETING = "deleting",
19
+ RATE_LIMITED = "rate-limited",
20
+ IMAGE_UNREADABLE = "image-unreadable",
21
+ IMAGE_TOO_LARGE = "image-too-large",
22
+ MEDIA_UNAVAILABLE = "media-unavailable",
23
+ POST_EMPTY = "post-empty",
24
+ COMMENTS_DISABLED = "comments-disabled",
25
+ CANNOT_FOLLOW_SELF = "cannot-follow-self",
26
+ CANNOT_MESSAGE = "cannot-message",
27
+ MESSAGE_EMPTY = "message-empty",
28
+ ALREADY_REPORTED = "already-reported",
29
+ ALREADY_APPEALED = "already-appealed",
30
+ APPEAL_NOT_ALLOWED = "appeal-not-allowed",
31
+ EXPORT_TOO_SOON = "export-too-soon",
32
+ EMAIL_RESEND_TOO_SOON = "email-resend-too-soon",
33
+ CONFIRMATION_INVALID = "confirmation-invalid",
34
+ CASE_CLAIMED = "case-claimed",
35
+ CASE_RESOLVED = "case-resolved",
36
+ APPEAL_OWN_DECISION = "appeal-own-decision"
37
+ }
@@ -0,0 +1,38 @@
1
+ /**
2
+ * Why `social-api` refused something a member can do something about.
3
+ *
4
+ * Sent as `error.details.reason`. A site that shows Georgian to a Georgian reader cannot print the
5
+ * API's English sentence at them, so each of these is a key the site translates. The English
6
+ * `message` remains for a log line and for anything that does not know this list.
7
+ */
8
+ export var SocialRefusal;
9
+ (function (SocialRefusal) {
10
+ SocialRefusal["PROFILE_MISSING"] = "profile-missing";
11
+ SocialRefusal["PROFILE_EXISTS"] = "profile-exists";
12
+ SocialRefusal["HANDLE_TAKEN"] = "handle-taken";
13
+ SocialRefusal["HANDLE_RESERVED"] = "handle-reserved";
14
+ SocialRefusal["HANDLE_CHANGED_RECENTLY"] = "handle-changed-recently";
15
+ SocialRefusal["TOO_YOUNG"] = "too-young";
16
+ SocialRefusal["TERMS_OUTDATED"] = "terms-outdated";
17
+ SocialRefusal["SUSPENDED"] = "suspended";
18
+ SocialRefusal["BANNED"] = "banned";
19
+ SocialRefusal["DELETING"] = "deleting";
20
+ SocialRefusal["RATE_LIMITED"] = "rate-limited";
21
+ SocialRefusal["IMAGE_UNREADABLE"] = "image-unreadable";
22
+ SocialRefusal["IMAGE_TOO_LARGE"] = "image-too-large";
23
+ SocialRefusal["MEDIA_UNAVAILABLE"] = "media-unavailable";
24
+ SocialRefusal["POST_EMPTY"] = "post-empty";
25
+ SocialRefusal["COMMENTS_DISABLED"] = "comments-disabled";
26
+ SocialRefusal["CANNOT_FOLLOW_SELF"] = "cannot-follow-self";
27
+ SocialRefusal["CANNOT_MESSAGE"] = "cannot-message";
28
+ SocialRefusal["MESSAGE_EMPTY"] = "message-empty";
29
+ SocialRefusal["ALREADY_REPORTED"] = "already-reported";
30
+ SocialRefusal["ALREADY_APPEALED"] = "already-appealed";
31
+ SocialRefusal["APPEAL_NOT_ALLOWED"] = "appeal-not-allowed";
32
+ SocialRefusal["EXPORT_TOO_SOON"] = "export-too-soon";
33
+ SocialRefusal["EMAIL_RESEND_TOO_SOON"] = "email-resend-too-soon";
34
+ SocialRefusal["CONFIRMATION_INVALID"] = "confirmation-invalid";
35
+ SocialRefusal["CASE_CLAIMED"] = "case-claimed";
36
+ SocialRefusal["CASE_RESOLVED"] = "case-resolved";
37
+ SocialRefusal["APPEAL_OWN_DECISION"] = "appeal-own-decision";
38
+ })(SocialRefusal || (SocialRefusal = {}));
@@ -0,0 +1,18 @@
1
+ /**
2
+ * Why a member reported something.
3
+ *
4
+ * `child-safety` is the one that changes what happens: the content is hidden at once and the case
5
+ * goes to the top of the queue, before anybody has looked at it.
6
+ */
7
+ export declare enum SocialReportReason {
8
+ SPAM = "spam",
9
+ HARASSMENT = "harassment",
10
+ HATE = "hate",
11
+ VIOLENCE = "violence",
12
+ NUDITY = "nudity",
13
+ CHILD_SAFETY = "child-safety",
14
+ SELF_HARM = "self-harm",
15
+ IMPERSONATION = "impersonation",
16
+ ILLEGAL = "illegal",
17
+ OTHER = "other"
18
+ }
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Why a member reported something.
3
+ *
4
+ * `child-safety` is the one that changes what happens: the content is hidden at once and the case
5
+ * goes to the top of the queue, before anybody has looked at it.
6
+ */
7
+ export var SocialReportReason;
8
+ (function (SocialReportReason) {
9
+ SocialReportReason["SPAM"] = "spam";
10
+ SocialReportReason["HARASSMENT"] = "harassment";
11
+ SocialReportReason["HATE"] = "hate";
12
+ SocialReportReason["VIOLENCE"] = "violence";
13
+ SocialReportReason["NUDITY"] = "nudity";
14
+ SocialReportReason["CHILD_SAFETY"] = "child-safety";
15
+ SocialReportReason["SELF_HARM"] = "self-harm";
16
+ SocialReportReason["IMPERSONATION"] = "impersonation";
17
+ SocialReportReason["ILLEGAL"] = "illegal";
18
+ SocialReportReason["OTHER"] = "other";
19
+ })(SocialReportReason || (SocialReportReason = {}));
@@ -0,0 +1,8 @@
1
+ /** The kinds of thing a member can report. */
2
+ export declare enum SocialReportTarget {
3
+ POST = "post",
4
+ COMMENT = "comment",
5
+ STORY = "story",
6
+ MEMBER = "member",
7
+ MESSAGE = "message"
8
+ }
@@ -0,0 +1,9 @@
1
+ /** The kinds of thing a member can report. */
2
+ export var SocialReportTarget;
3
+ (function (SocialReportTarget) {
4
+ SocialReportTarget["POST"] = "post";
5
+ SocialReportTarget["COMMENT"] = "comment";
6
+ SocialReportTarget["STORY"] = "story";
7
+ SocialReportTarget["MEMBER"] = "member";
8
+ SocialReportTarget["MESSAGE"] = "message";
9
+ })(SocialReportTarget || (SocialReportTarget = {}));
@@ -0,0 +1,30 @@
1
+ import type { IsoDateTime } from '../../type/iso-date-time.type.js';
2
+ import type { Nullable } from '../../type/nil.type.js';
3
+ import type { UUID } from '../../type/uuid.type.js';
4
+ import type { SocialImage } from './social-image.type.js';
5
+ import type { SocialMemberCard } from './social-member.type.js';
6
+ export interface SocialStory {
7
+ id: UUID;
8
+ image: SocialImage;
9
+ caption: Nullable<string>;
10
+ createdAt: IsoDateTime;
11
+ expiresAt: IsoDateTime;
12
+ viewerSeen: boolean;
13
+ /** Only the author is told. */
14
+ viewCount: Nullable<number>;
15
+ }
16
+ /** Everything one person has up today. */
17
+ export interface SocialStoryReel {
18
+ author: SocialMemberCard;
19
+ stories: SocialStory[];
20
+ hasUnseen: boolean;
21
+ }
22
+ export interface CreateSocialStoryRequest {
23
+ mediaId: UUID;
24
+ caption?: Nullable<string>;
25
+ altText?: Nullable<string>;
26
+ }
27
+ export interface SocialStoryViewer {
28
+ member: SocialMemberCard;
29
+ viewedAt: IsoDateTime;
30
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -499,6 +499,18 @@ export declare enum UserPermission {
499
499
  RESTAURANT_MARKETING_MANAGE = "restaurant:marketing:manage",
500
500
  /** See sales reports. */
501
501
  RESTAURANT_REPORT_READ = "restaurant:report:read",
502
+ /** See Ezo's moderation queue, what was reported and the appeals against decisions. */
503
+ SOCIAL_MODERATION_READ = "social:moderation:read",
504
+ /** Decide a case: dismiss it, remove the content, warn, suspend or ban. */
505
+ SOCIAL_MODERATION_DECIDE = "social:moderation:decide",
506
+ /** Answer an appeal. Never against your own decision, which the service refuses. */
507
+ SOCIAL_APPEAL_DECIDE = "social:appeal:decide",
508
+ /** Look up members and their records. */
509
+ SOCIAL_MEMBER_READ = "social:member:read",
510
+ /** Suspend, ban or reinstate a member without a report behind it. */
511
+ SOCIAL_MEMBER_SANCTION = "social:member:sanction",
512
+ /** Read the record of what staff looked at and did. */
513
+ SOCIAL_AUDIT_READ = "social:audit:read",
502
514
  /** Read a company's HR settings, locations, departments and job titles. */
503
515
  HR_ORG_READ = "hr:org:read",
504
516
  /** Change them. */
@@ -562,6 +562,18 @@ export var UserPermission;
562
562
  UserPermission["RESTAURANT_MARKETING_MANAGE"] = "restaurant:marketing:manage";
563
563
  /** See sales reports. */
564
564
  UserPermission["RESTAURANT_REPORT_READ"] = "restaurant:report:read";
565
+ /** See Ezo's moderation queue, what was reported and the appeals against decisions. */
566
+ UserPermission["SOCIAL_MODERATION_READ"] = "social:moderation:read";
567
+ /** Decide a case: dismiss it, remove the content, warn, suspend or ban. */
568
+ UserPermission["SOCIAL_MODERATION_DECIDE"] = "social:moderation:decide";
569
+ /** Answer an appeal. Never against your own decision, which the service refuses. */
570
+ UserPermission["SOCIAL_APPEAL_DECIDE"] = "social:appeal:decide";
571
+ /** Look up members and their records. */
572
+ UserPermission["SOCIAL_MEMBER_READ"] = "social:member:read";
573
+ /** Suspend, ban or reinstate a member without a report behind it. */
574
+ UserPermission["SOCIAL_MEMBER_SANCTION"] = "social:member:sanction";
575
+ /** Read the record of what staff looked at and did. */
576
+ UserPermission["SOCIAL_AUDIT_READ"] = "social:audit:read";
565
577
  // HR
566
578
  /** Read a company's HR settings, locations, departments and job titles. */
567
579
  UserPermission["HR_ORG_READ"] = "hr:org:read";
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@iveri/contracts",
3
- "version": "0.55.0",
3
+ "version": "0.60.0",
4
4
  "description": "Wire contracts shared by every Iveri backend and frontend. Zero runtime dependencies.",
5
5
  "license": "MIT",
6
6
  "repository": {
@@ -52,6 +52,10 @@
52
52
  "types": "./dist/api/clinic/index.d.ts",
53
53
  "default": "./dist/api/clinic/index.js"
54
54
  },
55
+ "./social": {
56
+ "types": "./dist/api/social/index.d.ts",
57
+ "default": "./dist/api/social/index.js"
58
+ },
55
59
  "./hr": {
56
60
  "types": "./dist/api/hr/index.d.ts",
57
61
  "default": "./dist/api/hr/index.js"