@jsm-mit/sultana-core-motoko-package 0.2.0 → 0.3.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.
@@ -195,6 +195,11 @@ type SalonPublicInfo =
195
195
  name: text;
196
196
  thumbnailAssetId: opt AssetId;
197
197
  };
198
+ type SalonInvite =
199
+ record {
200
+ expiresAtNs: int;
201
+ token: text;
202
+ };
198
203
  type SalonId = text;
199
204
  type SalonCandidatesEntry =
200
205
  record {
@@ -264,47 +269,52 @@ type Result_4 =
264
269
  err: Error;
265
270
  ok: principal;
266
271
  };
267
- type Result_35 =
272
+ type Result_37 =
268
273
  variant {
269
274
  err: Error;
270
275
  ok: PromoId;
271
276
  };
272
- type Result_34 =
277
+ type Result_36 =
273
278
  variant {
274
279
  err: Error;
275
280
  ok: SalonServiceId;
276
281
  };
277
- type Result_33 =
282
+ type Result_35 =
278
283
  variant {
279
284
  err: Error;
280
285
  ok: vec SalonServiceId;
281
286
  };
282
- type Result_32 =
287
+ type Result_34 =
283
288
  variant {
284
289
  err: Error;
285
290
  ok: vec SalonId;
286
291
  };
287
- type Result_31 =
292
+ type Result_33 =
288
293
  variant {
289
294
  err: Error;
290
295
  ok: AppointmentId;
291
296
  };
292
- type Result_30 =
297
+ type Result_32 =
293
298
  variant {
294
299
  err: Error;
295
- ok: ActionQuotaLimits;
300
+ ok: SalonInvite;
296
301
  };
297
- type Result_3 =
302
+ type Result_31 =
298
303
  variant {
299
304
  err: Error;
300
- ok: nat;
305
+ ok: ActionQuotaLimits;
301
306
  };
302
- type Result_29 =
307
+ type Result_30 =
303
308
  variant {
304
309
  err: Error;
305
310
  ok: vec SupportedLanguage;
306
311
  };
307
- type Result_28 =
312
+ type Result_3 =
313
+ variant {
314
+ err: Error;
315
+ ok: nat;
316
+ };
317
+ type Result_29 =
308
318
  variant {
309
319
  err: Error;
310
320
  ok: record {
@@ -312,32 +322,32 @@ type Result_28 =
312
322
  trackingSinceNs: nat64;
313
323
  };
314
324
  };
315
- type Result_27 =
325
+ type Result_28 =
316
326
  variant {
317
327
  err: Error;
318
328
  ok: vec DailyScheduleEntry;
319
329
  };
320
- type Result_26 =
330
+ type Result_27 =
321
331
  variant {
322
332
  err: Error;
323
333
  ok: vec nat64;
324
334
  };
325
- type Result_25 =
335
+ type Result_26 =
326
336
  variant {
327
337
  err: Error;
328
338
  ok: TimeMask;
329
339
  };
330
- type Result_24 =
340
+ type Result_25 =
331
341
  variant {
332
342
  err: Error;
333
343
  ok: MigrationData;
334
344
  };
335
- type Result_23 =
345
+ type Result_24 =
336
346
  variant {
337
347
  err: Error;
338
348
  ok: vec Appointment;
339
349
  };
340
- type Result_22 =
350
+ type Result_23 =
341
351
  variant {
342
352
  err: Error;
343
353
  ok: record {
@@ -346,16 +356,21 @@ type Result_22 =
346
356
  updateThresholdMs: nat;
347
357
  };
348
358
  };
349
- type Result_21 =
359
+ type Result_22 =
350
360
  variant {
351
361
  err: Error;
352
362
  ok: vec SalonAsset;
353
363
  };
354
- type Result_20 =
364
+ type Result_21 =
355
365
  variant {
356
366
  err: Error;
357
367
  ok: vec DiscountCode;
358
368
  };
369
+ type Result_20 =
370
+ variant {
371
+ err: Error;
372
+ ok: opt SalonInvite;
373
+ };
359
374
  type Result_2 =
360
375
  variant {
361
376
  err: Error;
@@ -421,7 +436,11 @@ type Result =
421
436
  err: Error;
422
437
  ok: VisitId;
423
438
  };
424
- type RequestToJoinArgs = record {salonId: SalonId;};
439
+ type RequestToJoinArgs =
440
+ record {
441
+ salonId: SalonId;
442
+ token: text;
443
+ };
425
444
  type RemoveWorkerFromSalonArgs =
426
445
  record {
427
446
  salonId: SalonId;
@@ -683,6 +702,11 @@ type Coordinate =
683
702
  lat: float64;
684
703
  lng: float64;
685
704
  };
705
+ type CheckSalonInviteArgs =
706
+ record {
707
+ salonId: SalonId;
708
+ token: text;
709
+ };
686
710
  type CanUploadAssetArgs =
687
711
  record {
688
712
  declaredSizeBytes: opt nat;
@@ -834,30 +858,35 @@ service : {
834
858
  addLanguage: (code: LangCode) -> (Result_1);
835
859
  /// Owner attaches a promo (max 3 per salon): #Ready media from the salon's library,
836
860
  /// target = the salon or one of its services, CTA = button label / show-delay / discount code
837
- addPromo: (args: AddPromoArgs) -> (Result_35);
861
+ addPromo: (args: AddPromoArgs) -> (Result_37);
838
862
  /// Adds a new service to a specific salon
839
- addSalonService: (args: AddSalonServiceArgs) -> (Result_34);
863
+ addSalonService: (args: AddSalonServiceArgs) -> (Result_36);
840
864
  addServiceType: (id: ServiceTypeId) -> (Result_1);
841
865
  addServiceTypeToSalonService: (args: AddOrRemoveServiceTypeInSalonArgs) ->
842
866
  (Result_1);
843
867
  addWorkerToSalonService: (args: AddOrRemoveWorkerInSalonArgs) -> (Result_1);
844
868
  /// Owner attaches an image from the salon's library to one of that salon's services
845
869
  attachImageToSalonService: (args: AttachOrDetachImageArgs) -> (Result_1);
846
- bookAppointment: (args: BookAppointmentArgs) -> (Result_31);
870
+ bookAppointment: (args: BookAppointmentArgs) -> (Result_33);
847
871
  bulkAcceptWorkers: (args: BulkAcceptWorkersArgs) -> (Result_1);
848
- bulkAddSalonServices: (args: BulkAddSalonServicesArgs) -> (Result_33);
872
+ bulkAddSalonServices: (args: BulkAddSalonServicesArgs) -> (Result_35);
849
873
  bulkAddServiceTypes: (ids: vec ServiceTypeId) -> (Result_14);
850
- bulkCreateSalons: (args: BulkCreateSalonsArgs) -> (Result_32);
874
+ bulkCreateSalons: (args: BulkCreateSalonsArgs) -> (Result_34);
851
875
  bulkRequestToJoinSalons: (args: BulkRequestToJoinSalonsArgs) -> (Result_1);
852
876
  /// Superadmin: bulk import of translations (seeding / migration) — all-or-nothing batch
853
877
  bulkSetTranslations: (items: vec SetTranslationArgs) -> (Result_3);
854
878
  bulkSetWeeklyTemplates: (args: BulkSetWeeklyTemplatesArgs) -> (Result_1);
855
879
  /// Asset canister only: pre-upload authorization, asked before any bytes are stored
856
880
  canUploadAsset: (args: CanUploadAssetArgs) -> (Result_1);
857
- cancelAppointment: (appointmentId: AppointmentId) -> (Result_31);
881
+ cancelAppointment: (appointmentId: AppointmentId) -> (Result_33);
882
+ /// Is an invite link still good? Open to anonymous callers — the page behind the link has
883
+ /// to answer before there is an identity to ask about.
884
+ checkSalonInvite: (args: CheckSalonInviteArgs) -> (Result_1) query;
858
885
  clearLogs: () -> ();
859
886
  /// Creates a new salon and links it to the caller
860
887
  createSalon: (args: CreateSalonArgs) -> (Result_5);
888
+ /// Owner mints the salon's worker-invite link (replaces any outstanding one)
889
+ createSalonInvite: (salonId: SalonId) -> (Result_32);
861
890
  createVisit: (args: CreateVisitArgs) -> (Result);
862
891
  /// Superadmin only: raw byte removal on sultana-assets-rust (orphaned-bytes cleanup)
863
892
  deleteAssetRaw: (assetId: text) -> (Result_1);
@@ -868,48 +897,51 @@ service : {
868
897
  deregisterAsset: (args: DeregisterAssetArgs) -> (Result_1);
869
898
  /// Owner detaches an image from a service (the asset stays in the salon's library)
870
899
  detachImageFromSalonService: (args: AttachOrDetachImageArgs) -> (Result_1);
871
- getActionQuotaLimits: () -> (Result_30) query;
900
+ getActionQuotaLimits: () -> (Result_31) query;
872
901
  /// Superadmin: every supported language incl. inactive ones (admin panel view)
873
- getAllLanguages: () -> (Result_29) query;
902
+ getAllLanguages: () -> (Result_30) query;
874
903
  getAllProfiles: () -> (Result_8) query;
875
904
  getAppointmentsForSalon: (args: GetSalonAppointmentsArgs) ->
876
- (Result_23) query;
905
+ (Result_24) query;
877
906
  getAssetCanisterPrincipal: () -> (Result_4) query;
878
907
  /// Superadmin-only: returns every principal's lifetime (total, productive) call counters plus the tracking window start
879
- getCallActivityStats: () -> (Result_28) query;
908
+ getCallActivityStats: () -> (Result_29) query;
880
909
  /// Returns the list of profiles waiting for approval (Owner only)
881
910
  getCandidatesBySalonId: (salonId: SalonId) -> (Result_8) query;
882
911
  /// Returns a specific daily override if it exists
883
- getDailySchedule: (args: GetDailyScheduleArgs) -> (Result_25) query;
912
+ getDailySchedule: (args: GetDailyScheduleArgs) -> (Result_26) query;
884
913
  /// Returns daily schedules with midnight timestamp in [fromDate, toDate] - for data migration to another canister
885
914
  getDailySchedulesForMigration: (args: DailyScheduleRangeArgs) ->
886
- (Result_27) query;
915
+ (Result_28) query;
887
916
  getDayFromWeeklyTemplate: (args: GetDayFromWeeklyTemplateArgs) ->
888
- (Result_26) query;
917
+ (Result_27) query;
889
918
  /// Returns the effective availability mask (daily override or weekly template fallback)
890
919
  getEffectiveMaskForSalon: (args: GetEffectiveMaskForSalonArgs) ->
891
- (Result_25) query;
920
+ (Result_26) query;
892
921
  /// Returns the highest migrationId for the given entity (= total number of records ever created)
893
922
  getLastMigrationId: (entity: MigrationEntity) -> (Result_3) query;
894
923
  getLoggingEnabled: () -> (Result_1) query;
895
924
  getLogs: () -> (text) query;
896
925
  /// Returns a page of migration data for the given entity and id range [from, to]
897
- getMigrationData: (args: MigrationQueryArgs) -> (Result_24) query;
898
- getMyAppointments: () -> (Result_23) query;
926
+ getMigrationData: (args: MigrationQueryArgs) -> (Result_25) query;
927
+ getMyAppointments: () -> (Result_24) query;
899
928
  getMyProfile: () -> (Result_2) query;
900
929
  getMySalons: () -> (Result_17) query;
901
930
  getMyWorkerAppointments: (args: GetMyWorkerAppointmentsArgs) ->
902
- (Result_23) query;
931
+ (Result_24) query;
903
932
  /// Whether the one-way production switch has been flipped
904
933
  getProdMode: () -> (bool) query;
905
934
  /// Public geo feed: promos in the given geohash6 cells (search pattern — the frontend
906
935
  /// picks and adapts the cell set; core does exact-key lookups only)
907
936
  getPromoFeed: (args: GetPromoFeedArgs) -> (Result_19) query;
908
- getReportSettings: () -> (Result_22) query;
937
+ getReportSettings: () -> (Result_23) query;
909
938
  /// Returns the salon's asset library (readable only by the salon's current owner)
910
- getSalonAssets: (salonId: SalonId) -> (Result_21) query;
939
+ getSalonAssets: (salonId: SalonId) -> (Result_22) query;
911
940
  /// Owner-only: the salon's discount codes (semi-secret until broadcast via a promo)
912
- getSalonDiscountCodes: (salonId: SalonId) -> (Result_20) query;
941
+ getSalonDiscountCodes: (salonId: SalonId) -> (Result_21) query;
942
+ /// The salon's outstanding invite, or null when there is none or it has expired (Owner only)
943
+ getSalonInvite: (salonId: SalonId) -> (Result_20) query;
944
+ getSalonInviteTtl: () -> (Result_3) query;
913
945
  /// Public: the salon's current promos
914
946
  getSalonPromos: (salonId: SalonId) -> (Result_19) query;
915
947
  /// Returns the list of salon services by salon ID (owner view)
@@ -964,7 +996,7 @@ service : {
964
996
  removeWorkerFromSalonService: (args: AddOrRemoveWorkerInSalonArgs) ->
965
997
  (Result_1);
966
998
  reportOperationStats: (args: vec RecordOperationStatArgs) -> (Result_3);
967
- /// Worker sends a request to join a specific salon
999
+ /// The one way to become a candidate: follow the owner's invite link (args carry its token)
968
1000
  requestToJoinSalon: (args: RequestToJoinArgs) -> (Result_1);
969
1001
  /// Superadmin-only: wipes all call-activity counters and restarts the tracking window from now, returns the new trackingSinceNs
970
1002
  resetCallActivityStats: () -> (Result_7);
@@ -985,6 +1017,7 @@ service : {
985
1017
  setProdMode: () -> (Result_1);
986
1018
  setReportBatchSize: (size: nat) -> (Result_3);
987
1019
  setReportThreshold: (args: SetReportThresholdArgs) -> (Result_3);
1020
+ setSalonInviteTtl: (newTtlSeconds: nat) -> (Result_3);
988
1021
  /// Owner-only: set/clear the salon's profile photos (thumbnail + cover) — asset ids must
989
1022
  /// be #Ready Image assets from the salon's own library.
990
1023
  setSalonPhotos: (args: SetSalonPhotosArgs) -> (Result_5);
@@ -117,6 +117,7 @@ export interface CanUploadAssetArgs {
117
117
  'declaredSizeBytes' : [] | [bigint],
118
118
  'salonId' : SalonId,
119
119
  }
120
+ export interface CheckSalonInviteArgs { 'token' : string, 'salonId' : SalonId }
120
121
  export interface Coordinate { 'lat' : number, 'lng' : number }
121
122
  export interface CreateSalonArgs {
122
123
  'name' : string,
@@ -310,7 +311,7 @@ export interface RemoveWorkerFromSalonArgs {
310
311
  'workerId' : Principal,
311
312
  'salonId' : SalonId,
312
313
  }
313
- export interface RequestToJoinArgs { 'salonId' : SalonId }
314
+ export interface RequestToJoinArgs { 'token' : string, 'salonId' : SalonId }
314
315
  export type Result = { 'ok' : VisitId } |
315
316
  { 'err' : Error };
316
317
  export type Result_1 = { 'ok' : boolean } |
@@ -337,11 +338,13 @@ export type Result_19 = { 'ok' : Array<PromoItem> } |
337
338
  { 'err' : Error };
338
339
  export type Result_2 = { 'ok' : UserProfile } |
339
340
  { 'err' : Error };
340
- export type Result_20 = { 'ok' : Array<DiscountCode> } |
341
+ export type Result_20 = { 'ok' : [] | [SalonInvite] } |
341
342
  { 'err' : Error };
342
- export type Result_21 = { 'ok' : Array<SalonAsset> } |
343
+ export type Result_21 = { 'ok' : Array<DiscountCode> } |
343
344
  { 'err' : Error };
344
- export type Result_22 = {
345
+ export type Result_22 = { 'ok' : Array<SalonAsset> } |
346
+ { 'err' : Error };
347
+ export type Result_23 = {
345
348
  'ok' : {
346
349
  'queryThresholdMs' : bigint,
347
350
  'updateThresholdMs' : bigint,
@@ -349,35 +352,37 @@ export type Result_22 = {
349
352
  }
350
353
  } |
351
354
  { 'err' : Error };
352
- export type Result_23 = { 'ok' : Array<Appointment> } |
355
+ export type Result_24 = { 'ok' : Array<Appointment> } |
353
356
  { 'err' : Error };
354
- export type Result_24 = { 'ok' : MigrationData } |
357
+ export type Result_25 = { 'ok' : MigrationData } |
355
358
  { 'err' : Error };
356
- export type Result_25 = { 'ok' : TimeMask } |
359
+ export type Result_26 = { 'ok' : TimeMask } |
357
360
  { 'err' : Error };
358
- export type Result_26 = { 'ok' : BigUint64Array | bigint[] } |
361
+ export type Result_27 = { 'ok' : BigUint64Array | bigint[] } |
359
362
  { 'err' : Error };
360
- export type Result_27 = { 'ok' : Array<DailyScheduleEntry> } |
363
+ export type Result_28 = { 'ok' : Array<DailyScheduleEntry> } |
361
364
  { 'err' : Error };
362
- export type Result_28 = {
365
+ export type Result_29 = {
363
366
  'ok' : { 'entries' : Array<CallActivityEntry>, 'trackingSinceNs' : bigint }
364
367
  } |
365
368
  { 'err' : Error };
366
- export type Result_29 = { 'ok' : Array<SupportedLanguage> } |
367
- { 'err' : Error };
368
369
  export type Result_3 = { 'ok' : bigint } |
369
370
  { 'err' : Error };
370
- export type Result_30 = { 'ok' : ActionQuotaLimits } |
371
+ export type Result_30 = { 'ok' : Array<SupportedLanguage> } |
372
+ { 'err' : Error };
373
+ export type Result_31 = { 'ok' : ActionQuotaLimits } |
374
+ { 'err' : Error };
375
+ export type Result_32 = { 'ok' : SalonInvite } |
371
376
  { 'err' : Error };
372
- export type Result_31 = { 'ok' : AppointmentId } |
377
+ export type Result_33 = { 'ok' : AppointmentId } |
373
378
  { 'err' : Error };
374
- export type Result_32 = { 'ok' : Array<SalonId> } |
379
+ export type Result_34 = { 'ok' : Array<SalonId> } |
375
380
  { 'err' : Error };
376
- export type Result_33 = { 'ok' : Array<SalonServiceId> } |
381
+ export type Result_35 = { 'ok' : Array<SalonServiceId> } |
377
382
  { 'err' : Error };
378
- export type Result_34 = { 'ok' : SalonServiceId } |
383
+ export type Result_36 = { 'ok' : SalonServiceId } |
379
384
  { 'err' : Error };
380
- export type Result_35 = { 'ok' : PromoId } |
385
+ export type Result_37 = { 'ok' : PromoId } |
381
386
  { 'err' : Error };
382
387
  export type Result_4 = { 'ok' : Principal } |
383
388
  { 'err' : Error };
@@ -423,6 +428,7 @@ export interface SalonCandidatesEntry {
423
428
  'salonId' : SalonId,
424
429
  }
425
430
  export type SalonId = string;
431
+ export interface SalonInvite { 'expiresAtNs' : bigint, 'token' : string }
426
432
  export interface SalonPublicInfo {
427
433
  'id' : SalonId,
428
434
  'name' : string,
@@ -593,11 +599,11 @@ export interface _SERVICE {
593
599
  * / Owner attaches a promo (max 3 per salon): #Ready media from the salon's library,
594
600
  * / target = the salon or one of its services, CTA = button label / show-delay / discount code
595
601
  */
596
- 'addPromo' : ActorMethod<[AddPromoArgs], Result_35>,
602
+ 'addPromo' : ActorMethod<[AddPromoArgs], Result_37>,
597
603
  /**
598
604
  * / Adds a new service to a specific salon
599
605
  */
600
- 'addSalonService' : ActorMethod<[AddSalonServiceArgs], Result_34>,
606
+ 'addSalonService' : ActorMethod<[AddSalonServiceArgs], Result_36>,
601
607
  'addServiceType' : ActorMethod<[ServiceTypeId], Result_1>,
602
608
  'addServiceTypeToSalonService' : ActorMethod<
603
609
  [AddOrRemoveServiceTypeInSalonArgs],
@@ -614,11 +620,11 @@ export interface _SERVICE {
614
620
  [AttachOrDetachImageArgs],
615
621
  Result_1
616
622
  >,
617
- 'bookAppointment' : ActorMethod<[BookAppointmentArgs], Result_31>,
623
+ 'bookAppointment' : ActorMethod<[BookAppointmentArgs], Result_33>,
618
624
  'bulkAcceptWorkers' : ActorMethod<[BulkAcceptWorkersArgs], Result_1>,
619
- 'bulkAddSalonServices' : ActorMethod<[BulkAddSalonServicesArgs], Result_33>,
625
+ 'bulkAddSalonServices' : ActorMethod<[BulkAddSalonServicesArgs], Result_35>,
620
626
  'bulkAddServiceTypes' : ActorMethod<[Array<ServiceTypeId>], Result_14>,
621
- 'bulkCreateSalons' : ActorMethod<[BulkCreateSalonsArgs], Result_32>,
627
+ 'bulkCreateSalons' : ActorMethod<[BulkCreateSalonsArgs], Result_34>,
622
628
  'bulkRequestToJoinSalons' : ActorMethod<
623
629
  [BulkRequestToJoinSalonsArgs],
624
630
  Result_1
@@ -635,12 +641,21 @@ export interface _SERVICE {
635
641
  * / Asset canister only: pre-upload authorization, asked before any bytes are stored
636
642
  */
637
643
  'canUploadAsset' : ActorMethod<[CanUploadAssetArgs], Result_1>,
638
- 'cancelAppointment' : ActorMethod<[AppointmentId], Result_31>,
644
+ 'cancelAppointment' : ActorMethod<[AppointmentId], Result_33>,
645
+ /**
646
+ * / Is an invite link still good? Open to anonymous callers — the page behind the link has
647
+ * / to answer before there is an identity to ask about.
648
+ */
649
+ 'checkSalonInvite' : ActorMethod<[CheckSalonInviteArgs], Result_1>,
639
650
  'clearLogs' : ActorMethod<[], undefined>,
640
651
  /**
641
652
  * / Creates a new salon and links it to the caller
642
653
  */
643
654
  'createSalon' : ActorMethod<[CreateSalonArgs], Result_5>,
655
+ /**
656
+ * / Owner mints the salon's worker-invite link (replaces any outstanding one)
657
+ */
658
+ 'createSalonInvite' : ActorMethod<[SalonId], Result_32>,
644
659
  'createVisit' : ActorMethod<[CreateVisitArgs], Result>,
645
660
  /**
646
661
  * / Superadmin only: raw byte removal on sultana-assets-rust (orphaned-bytes cleanup)
@@ -662,21 +677,21 @@ export interface _SERVICE {
662
677
  [AttachOrDetachImageArgs],
663
678
  Result_1
664
679
  >,
665
- 'getActionQuotaLimits' : ActorMethod<[], Result_30>,
680
+ 'getActionQuotaLimits' : ActorMethod<[], Result_31>,
666
681
  /**
667
682
  * / Superadmin: every supported language incl. inactive ones (admin panel view)
668
683
  */
669
- 'getAllLanguages' : ActorMethod<[], Result_29>,
684
+ 'getAllLanguages' : ActorMethod<[], Result_30>,
670
685
  'getAllProfiles' : ActorMethod<[], Result_8>,
671
686
  'getAppointmentsForSalon' : ActorMethod<
672
687
  [GetSalonAppointmentsArgs],
673
- Result_23
688
+ Result_24
674
689
  >,
675
690
  'getAssetCanisterPrincipal' : ActorMethod<[], Result_4>,
676
691
  /**
677
692
  * / Superadmin-only: returns every principal's lifetime (total, productive) call counters plus the tracking window start
678
693
  */
679
- 'getCallActivityStats' : ActorMethod<[], Result_28>,
694
+ 'getCallActivityStats' : ActorMethod<[], Result_29>,
680
695
  /**
681
696
  * / Returns the list of profiles waiting for approval (Owner only)
682
697
  */
@@ -684,24 +699,24 @@ export interface _SERVICE {
684
699
  /**
685
700
  * / Returns a specific daily override if it exists
686
701
  */
687
- 'getDailySchedule' : ActorMethod<[GetDailyScheduleArgs], Result_25>,
702
+ 'getDailySchedule' : ActorMethod<[GetDailyScheduleArgs], Result_26>,
688
703
  /**
689
704
  * / Returns daily schedules with midnight timestamp in [fromDate, toDate] - for data migration to another canister
690
705
  */
691
706
  'getDailySchedulesForMigration' : ActorMethod<
692
707
  [DailyScheduleRangeArgs],
693
- Result_27
708
+ Result_28
694
709
  >,
695
710
  'getDayFromWeeklyTemplate' : ActorMethod<
696
711
  [GetDayFromWeeklyTemplateArgs],
697
- Result_26
712
+ Result_27
698
713
  >,
699
714
  /**
700
715
  * / Returns the effective availability mask (daily override or weekly template fallback)
701
716
  */
702
717
  'getEffectiveMaskForSalon' : ActorMethod<
703
718
  [GetEffectiveMaskForSalonArgs],
704
- Result_25
719
+ Result_26
705
720
  >,
706
721
  /**
707
722
  * / Returns the highest migrationId for the given entity (= total number of records ever created)
@@ -712,13 +727,13 @@ export interface _SERVICE {
712
727
  /**
713
728
  * / Returns a page of migration data for the given entity and id range [from, to]
714
729
  */
715
- 'getMigrationData' : ActorMethod<[MigrationQueryArgs], Result_24>,
716
- 'getMyAppointments' : ActorMethod<[], Result_23>,
730
+ 'getMigrationData' : ActorMethod<[MigrationQueryArgs], Result_25>,
731
+ 'getMyAppointments' : ActorMethod<[], Result_24>,
717
732
  'getMyProfile' : ActorMethod<[], Result_2>,
718
733
  'getMySalons' : ActorMethod<[], Result_17>,
719
734
  'getMyWorkerAppointments' : ActorMethod<
720
735
  [GetMyWorkerAppointmentsArgs],
721
- Result_23
736
+ Result_24
722
737
  >,
723
738
  /**
724
739
  * / Whether the one-way production switch has been flipped
@@ -729,15 +744,20 @@ export interface _SERVICE {
729
744
  * / picks and adapts the cell set; core does exact-key lookups only)
730
745
  */
731
746
  'getPromoFeed' : ActorMethod<[GetPromoFeedArgs], Result_19>,
732
- 'getReportSettings' : ActorMethod<[], Result_22>,
747
+ 'getReportSettings' : ActorMethod<[], Result_23>,
733
748
  /**
734
749
  * / Returns the salon's asset library (readable only by the salon's current owner)
735
750
  */
736
- 'getSalonAssets' : ActorMethod<[SalonId], Result_21>,
751
+ 'getSalonAssets' : ActorMethod<[SalonId], Result_22>,
737
752
  /**
738
753
  * / Owner-only: the salon's discount codes (semi-secret until broadcast via a promo)
739
754
  */
740
- 'getSalonDiscountCodes' : ActorMethod<[SalonId], Result_20>,
755
+ 'getSalonDiscountCodes' : ActorMethod<[SalonId], Result_21>,
756
+ /**
757
+ * / The salon's outstanding invite, or null when there is none or it has expired (Owner only)
758
+ */
759
+ 'getSalonInvite' : ActorMethod<[SalonId], Result_20>,
760
+ 'getSalonInviteTtl' : ActorMethod<[], Result_3>,
741
761
  /**
742
762
  * / Public: the salon's current promos
743
763
  */
@@ -836,7 +856,7 @@ export interface _SERVICE {
836
856
  Result_3
837
857
  >,
838
858
  /**
839
- * / Worker sends a request to join a specific salon
859
+ * / The one way to become a candidate: follow the owner's invite link (args carry its token)
840
860
  */
841
861
  'requestToJoinSalon' : ActorMethod<[RequestToJoinArgs], Result_1>,
842
862
  /**
@@ -870,6 +890,7 @@ export interface _SERVICE {
870
890
  'setProdMode' : ActorMethod<[], Result_1>,
871
891
  'setReportBatchSize' : ActorMethod<[bigint], Result_3>,
872
892
  'setReportThreshold' : ActorMethod<[SetReportThresholdArgs], Result_3>,
893
+ 'setSalonInviteTtl' : ActorMethod<[bigint], Result_3>,
873
894
  /**
874
895
  * / Owner-only: set/clear the salon's profile photos (thumbnail + cover) — asset ids must
875
896
  * / be #Ready Image assets from the salon's own library.
@@ -49,7 +49,7 @@ export const idlFactory = ({ IDL }) => {
49
49
  'salonId' : SalonId,
50
50
  });
51
51
  const PromoId = IDL.Text;
52
- const Result_35 = IDL.Variant({ 'ok' : PromoId, 'err' : Error });
52
+ const Result_37 = IDL.Variant({ 'ok' : PromoId, 'err' : Error });
53
53
  const ServiceTypeId = IDL.Text;
54
54
  const AddSalonServiceArgs = IDL.Record({
55
55
  'duration' : IDL.Nat,
@@ -60,7 +60,7 @@ export const idlFactory = ({ IDL }) => {
60
60
  'price' : IDL.Nat,
61
61
  'salonId' : SalonId,
62
62
  });
63
- const Result_34 = IDL.Variant({ 'ok' : SalonServiceId, 'err' : Error });
63
+ const Result_36 = IDL.Variant({ 'ok' : SalonServiceId, 'err' : Error });
64
64
  const AddOrRemoveServiceTypeInSalonArgs = IDL.Record({
65
65
  'salonServiceId' : SalonServiceId,
66
66
  'serviceTypeId' : ServiceTypeId,
@@ -85,7 +85,7 @@ export const idlFactory = ({ IDL }) => {
85
85
  'timeOffset' : IDL.Int,
86
86
  });
87
87
  const AppointmentId = IDL.Text;
88
- const Result_31 = IDL.Variant({ 'ok' : AppointmentId, 'err' : Error });
88
+ const Result_33 = IDL.Variant({ 'ok' : AppointmentId, 'err' : Error });
89
89
  const BulkAcceptWorkersArgs = IDL.Record({
90
90
  'delegatedCaller' : IDL.Principal,
91
91
  'items' : IDL.Vec(AcceptWorkerArgs),
@@ -94,7 +94,7 @@ export const idlFactory = ({ IDL }) => {
94
94
  'delegatedCaller' : IDL.Principal,
95
95
  'items' : IDL.Vec(AddSalonServiceArgs),
96
96
  });
97
- const Result_33 = IDL.Variant({
97
+ const Result_35 = IDL.Variant({
98
98
  'ok' : IDL.Vec(SalonServiceId),
99
99
  'err' : Error,
100
100
  });
@@ -114,7 +114,7 @@ export const idlFactory = ({ IDL }) => {
114
114
  'delegatedCaller' : IDL.Principal,
115
115
  'items' : IDL.Vec(CreateSalonArgs),
116
116
  });
117
- const Result_32 = IDL.Variant({ 'ok' : IDL.Vec(SalonId), 'err' : Error });
117
+ const Result_34 = IDL.Variant({ 'ok' : IDL.Vec(SalonId), 'err' : Error });
118
118
  const BulkRequestToJoinSalonsArgs = IDL.Record({
119
119
  'delegatedCaller' : IDL.Principal,
120
120
  'salonIds' : IDL.Vec(SalonId),
@@ -142,7 +142,16 @@ export const idlFactory = ({ IDL }) => {
142
142
  'declaredSizeBytes' : IDL.Opt(IDL.Nat),
143
143
  'salonId' : SalonId,
144
144
  });
145
+ const CheckSalonInviteArgs = IDL.Record({
146
+ 'token' : IDL.Text,
147
+ 'salonId' : SalonId,
148
+ });
145
149
  const Result_5 = IDL.Variant({ 'ok' : SalonId, 'err' : Error });
150
+ const SalonInvite = IDL.Record({
151
+ 'expiresAtNs' : IDL.Int,
152
+ 'token' : IDL.Text,
153
+ });
154
+ const Result_32 = IDL.Variant({ 'ok' : SalonInvite, 'err' : Error });
146
155
  const PaymentMethod = IDL.Variant({
147
156
  'Card' : IDL.Null,
148
157
  'Cash' : IDL.Null,
@@ -180,12 +189,12 @@ export const idlFactory = ({ IDL }) => {
180
189
  'user' : IDL.Nat,
181
190
  'worker' : IDL.Nat,
182
191
  });
183
- const Result_30 = IDL.Variant({ 'ok' : ActionQuotaLimits, 'err' : Error });
192
+ const Result_31 = IDL.Variant({ 'ok' : ActionQuotaLimits, 'err' : Error });
184
193
  const SupportedLanguage = IDL.Record({
185
194
  'active' : IDL.Bool,
186
195
  'code' : LangCode,
187
196
  });
188
- const Result_29 = IDL.Variant({
197
+ const Result_30 = IDL.Variant({
189
198
  'ok' : IDL.Vec(SupportedLanguage),
190
199
  'err' : Error,
191
200
  });
@@ -227,14 +236,14 @@ export const idlFactory = ({ IDL }) => {
227
236
  'salonId' : SalonId,
228
237
  'timeOffset' : IDL.Int,
229
238
  });
230
- const Result_23 = IDL.Variant({ 'ok' : IDL.Vec(Appointment), 'err' : Error });
239
+ const Result_24 = IDL.Variant({ 'ok' : IDL.Vec(Appointment), 'err' : Error });
231
240
  const Result_4 = IDL.Variant({ 'ok' : IDL.Principal, 'err' : Error });
232
241
  const CallActivityEntry = IDL.Record({
233
242
  'principal' : IDL.Principal,
234
243
  'totalUpdateCalls' : IDL.Nat,
235
244
  'productiveCalls' : IDL.Nat,
236
245
  });
237
- const Result_28 = IDL.Variant({
246
+ const Result_29 = IDL.Variant({
238
247
  'ok' : IDL.Record({
239
248
  'entries' : IDL.Vec(CallActivityEntry),
240
249
  'trackingSinceNs' : IDL.Nat64,
@@ -245,7 +254,7 @@ export const idlFactory = ({ IDL }) => {
245
254
  'workerId' : IDL.Principal,
246
255
  'date' : IDL.Nat64,
247
256
  });
248
- const Result_25 = IDL.Variant({ 'ok' : TimeMask, 'err' : Error });
257
+ const Result_26 = IDL.Variant({ 'ok' : TimeMask, 'err' : Error });
249
258
  const DailyScheduleRangeArgs = IDL.Record({
250
259
  'toDate' : IDL.Nat64,
251
260
  'fromDate' : IDL.Nat64,
@@ -255,7 +264,7 @@ export const idlFactory = ({ IDL }) => {
255
264
  'date' : IDL.Nat64,
256
265
  'mask' : TimeMask,
257
266
  });
258
- const Result_27 = IDL.Variant({
267
+ const Result_28 = IDL.Variant({
259
268
  'ok' : IDL.Vec(DailyScheduleEntry),
260
269
  'err' : Error,
261
270
  });
@@ -265,7 +274,7 @@ export const idlFactory = ({ IDL }) => {
265
274
  'workerId' : IDL.Principal,
266
275
  'salonId' : SalonId,
267
276
  });
268
- const Result_26 = IDL.Variant({ 'ok' : IDL.Vec(IDL.Nat64), 'err' : Error });
277
+ const Result_27 = IDL.Variant({ 'ok' : IDL.Vec(IDL.Nat64), 'err' : Error });
269
278
  const GetEffectiveMaskForSalonArgs = IDL.Record({
270
279
  'workerId' : IDL.Principal,
271
280
  'date' : IDL.Nat64,
@@ -410,7 +419,7 @@ export const idlFactory = ({ IDL }) => {
410
419
  'SalonAssets' : IDL.Vec(SalonAssetsEntry),
411
420
  'Promos' : IDL.Vec(PromoItem),
412
421
  });
413
- const Result_24 = IDL.Variant({ 'ok' : MigrationData, 'err' : Error });
422
+ const Result_25 = IDL.Variant({ 'ok' : MigrationData, 'err' : Error });
414
423
  const Result_2 = IDL.Variant({ 'ok' : UserProfile, 'err' : Error });
415
424
  const Result_17 = IDL.Variant({ 'ok' : IDL.Vec(Salon), 'err' : Error });
416
425
  const GetMyWorkerAppointmentsArgs = IDL.Record({
@@ -420,7 +429,7 @@ export const idlFactory = ({ IDL }) => {
420
429
  });
421
430
  const GetPromoFeedArgs = IDL.Record({ 'geohashes6' : IDL.Vec(Geohash) });
422
431
  const Result_19 = IDL.Variant({ 'ok' : IDL.Vec(PromoItem), 'err' : Error });
423
- const Result_22 = IDL.Variant({
432
+ const Result_23 = IDL.Variant({
424
433
  'ok' : IDL.Record({
425
434
  'queryThresholdMs' : IDL.Nat,
426
435
  'updateThresholdMs' : IDL.Nat,
@@ -428,11 +437,12 @@ export const idlFactory = ({ IDL }) => {
428
437
  }),
429
438
  'err' : Error,
430
439
  });
431
- const Result_21 = IDL.Variant({ 'ok' : IDL.Vec(SalonAsset), 'err' : Error });
432
- const Result_20 = IDL.Variant({
440
+ const Result_22 = IDL.Variant({ 'ok' : IDL.Vec(SalonAsset), 'err' : Error });
441
+ const Result_21 = IDL.Variant({
433
442
  'ok' : IDL.Vec(DiscountCode),
434
443
  'err' : Error,
435
444
  });
445
+ const Result_20 = IDL.Variant({ 'ok' : IDL.Opt(SalonInvite), 'err' : Error });
436
446
  const Result_6 = IDL.Variant({ 'ok' : IDL.Vec(SalonService), 'err' : Error });
437
447
  const SalonStorageUsage = IDL.Record({
438
448
  'pendingHeldBytes' : IDL.Nat,
@@ -545,7 +555,10 @@ export const idlFactory = ({ IDL }) => {
545
555
  'timestampNs' : IDL.Nat64,
546
556
  'durationMs' : IDL.Nat,
547
557
  });
548
- const RequestToJoinArgs = IDL.Record({ 'salonId' : SalonId });
558
+ const RequestToJoinArgs = IDL.Record({
559
+ 'token' : IDL.Text,
560
+ 'salonId' : SalonId,
561
+ });
549
562
  const Result_7 = IDL.Variant({ 'ok' : IDL.Nat64, 'err' : Error });
550
563
  const SearchForSalonServicesArgs = IDL.Record({
551
564
  'startTimeUTC' : IDL.Nat64,
@@ -614,8 +627,8 @@ export const idlFactory = ({ IDL }) => {
614
627
  'acceptWorker' : IDL.Func([AcceptWorkerArgs], [Result_1], []),
615
628
  'addDiscountCode' : IDL.Func([AddDiscountCodeArgs], [Result_1], []),
616
629
  'addLanguage' : IDL.Func([LangCode], [Result_1], []),
617
- 'addPromo' : IDL.Func([AddPromoArgs], [Result_35], []),
618
- 'addSalonService' : IDL.Func([AddSalonServiceArgs], [Result_34], []),
630
+ 'addPromo' : IDL.Func([AddPromoArgs], [Result_37], []),
631
+ 'addSalonService' : IDL.Func([AddSalonServiceArgs], [Result_36], []),
619
632
  'addServiceType' : IDL.Func([ServiceTypeId], [Result_1], []),
620
633
  'addServiceTypeToSalonService' : IDL.Func(
621
634
  [AddOrRemoveServiceTypeInSalonArgs],
@@ -632,15 +645,15 @@ export const idlFactory = ({ IDL }) => {
632
645
  [Result_1],
633
646
  [],
634
647
  ),
635
- 'bookAppointment' : IDL.Func([BookAppointmentArgs], [Result_31], []),
648
+ 'bookAppointment' : IDL.Func([BookAppointmentArgs], [Result_33], []),
636
649
  'bulkAcceptWorkers' : IDL.Func([BulkAcceptWorkersArgs], [Result_1], []),
637
650
  'bulkAddSalonServices' : IDL.Func(
638
651
  [BulkAddSalonServicesArgs],
639
- [Result_33],
652
+ [Result_35],
640
653
  [],
641
654
  ),
642
655
  'bulkAddServiceTypes' : IDL.Func([IDL.Vec(ServiceTypeId)], [Result_14], []),
643
- 'bulkCreateSalons' : IDL.Func([BulkCreateSalonsArgs], [Result_32], []),
656
+ 'bulkCreateSalons' : IDL.Func([BulkCreateSalonsArgs], [Result_34], []),
644
657
  'bulkRequestToJoinSalons' : IDL.Func(
645
658
  [BulkRequestToJoinSalonsArgs],
646
659
  [Result_1],
@@ -657,9 +670,15 @@ export const idlFactory = ({ IDL }) => {
657
670
  [],
658
671
  ),
659
672
  'canUploadAsset' : IDL.Func([CanUploadAssetArgs], [Result_1], []),
660
- 'cancelAppointment' : IDL.Func([AppointmentId], [Result_31], []),
673
+ 'cancelAppointment' : IDL.Func([AppointmentId], [Result_33], []),
674
+ 'checkSalonInvite' : IDL.Func(
675
+ [CheckSalonInviteArgs],
676
+ [Result_1],
677
+ ['query'],
678
+ ),
661
679
  'clearLogs' : IDL.Func([], [], []),
662
680
  'createSalon' : IDL.Func([CreateSalonArgs], [Result_5], []),
681
+ 'createSalonInvite' : IDL.Func([SalonId], [Result_32], []),
663
682
  'createVisit' : IDL.Func([CreateVisitArgs], [Result], []),
664
683
  'deleteAssetRaw' : IDL.Func([IDL.Text], [Result_1], []),
665
684
  'deleteStatsBeforeDate' : IDL.Func([IDL.Nat64], [Result_3], []),
@@ -669,54 +688,56 @@ export const idlFactory = ({ IDL }) => {
669
688
  [Result_1],
670
689
  [],
671
690
  ),
672
- 'getActionQuotaLimits' : IDL.Func([], [Result_30], ['query']),
673
- 'getAllLanguages' : IDL.Func([], [Result_29], ['query']),
691
+ 'getActionQuotaLimits' : IDL.Func([], [Result_31], ['query']),
692
+ 'getAllLanguages' : IDL.Func([], [Result_30], ['query']),
674
693
  'getAllProfiles' : IDL.Func([], [Result_8], ['query']),
675
694
  'getAppointmentsForSalon' : IDL.Func(
676
695
  [GetSalonAppointmentsArgs],
677
- [Result_23],
696
+ [Result_24],
678
697
  ['query'],
679
698
  ),
680
699
  'getAssetCanisterPrincipal' : IDL.Func([], [Result_4], ['query']),
681
- 'getCallActivityStats' : IDL.Func([], [Result_28], ['query']),
700
+ 'getCallActivityStats' : IDL.Func([], [Result_29], ['query']),
682
701
  'getCandidatesBySalonId' : IDL.Func([SalonId], [Result_8], ['query']),
683
702
  'getDailySchedule' : IDL.Func(
684
703
  [GetDailyScheduleArgs],
685
- [Result_25],
704
+ [Result_26],
686
705
  ['query'],
687
706
  ),
688
707
  'getDailySchedulesForMigration' : IDL.Func(
689
708
  [DailyScheduleRangeArgs],
690
- [Result_27],
709
+ [Result_28],
691
710
  ['query'],
692
711
  ),
693
712
  'getDayFromWeeklyTemplate' : IDL.Func(
694
713
  [GetDayFromWeeklyTemplateArgs],
695
- [Result_26],
714
+ [Result_27],
696
715
  ['query'],
697
716
  ),
698
717
  'getEffectiveMaskForSalon' : IDL.Func(
699
718
  [GetEffectiveMaskForSalonArgs],
700
- [Result_25],
719
+ [Result_26],
701
720
  ['query'],
702
721
  ),
703
722
  'getLastMigrationId' : IDL.Func([MigrationEntity], [Result_3], ['query']),
704
723
  'getLoggingEnabled' : IDL.Func([], [Result_1], ['query']),
705
724
  'getLogs' : IDL.Func([], [IDL.Text], ['query']),
706
- 'getMigrationData' : IDL.Func([MigrationQueryArgs], [Result_24], ['query']),
707
- 'getMyAppointments' : IDL.Func([], [Result_23], ['query']),
725
+ 'getMigrationData' : IDL.Func([MigrationQueryArgs], [Result_25], ['query']),
726
+ 'getMyAppointments' : IDL.Func([], [Result_24], ['query']),
708
727
  'getMyProfile' : IDL.Func([], [Result_2], ['query']),
709
728
  'getMySalons' : IDL.Func([], [Result_17], ['query']),
710
729
  'getMyWorkerAppointments' : IDL.Func(
711
730
  [GetMyWorkerAppointmentsArgs],
712
- [Result_23],
731
+ [Result_24],
713
732
  ['query'],
714
733
  ),
715
734
  'getProdMode' : IDL.Func([], [IDL.Bool], ['query']),
716
735
  'getPromoFeed' : IDL.Func([GetPromoFeedArgs], [Result_19], ['query']),
717
- 'getReportSettings' : IDL.Func([], [Result_22], ['query']),
718
- 'getSalonAssets' : IDL.Func([SalonId], [Result_21], ['query']),
719
- 'getSalonDiscountCodes' : IDL.Func([SalonId], [Result_20], ['query']),
736
+ 'getReportSettings' : IDL.Func([], [Result_23], ['query']),
737
+ 'getSalonAssets' : IDL.Func([SalonId], [Result_22], ['query']),
738
+ 'getSalonDiscountCodes' : IDL.Func([SalonId], [Result_21], ['query']),
739
+ 'getSalonInvite' : IDL.Func([SalonId], [Result_20], ['query']),
740
+ 'getSalonInviteTtl' : IDL.Func([], [Result_3], ['query']),
720
741
  'getSalonPromos' : IDL.Func([SalonId], [Result_19], ['query']),
721
742
  'getSalonServicesBySalonId' : IDL.Func([SalonId], [Result_6], ['query']),
722
743
  'getSalonStorageUsage' : IDL.Func([SalonId], [Result_18], ['query']),
@@ -790,6 +811,7 @@ export const idlFactory = ({ IDL }) => {
790
811
  'setProdMode' : IDL.Func([], [Result_1], []),
791
812
  'setReportBatchSize' : IDL.Func([IDL.Nat], [Result_3], []),
792
813
  'setReportThreshold' : IDL.Func([SetReportThresholdArgs], [Result_3], []),
814
+ 'setSalonInviteTtl' : IDL.Func([IDL.Nat], [Result_3], []),
793
815
  'setSalonPhotos' : IDL.Func([SetSalonPhotosArgs], [Result_5], []),
794
816
  'setSalonStorageLimit' : IDL.Func([IDL.Nat], [Result_3], []),
795
817
  'setSystemAdmin' : IDL.Func([IDL.Opt(IDL.Principal)], [Result_4], []),
@@ -145,6 +145,23 @@ export declare class AdminActor extends ActorBase {
145
145
  * @throws Error with message `CallRefusedAtInspectionStage` when the canister's `inspect_message` rejects the call before execution (oversized payload or anonymous caller) — a transport-level rejection, not a decoded Framework.Result #err.
146
146
  */
147
147
  setSalonStorageLimitAsyncUnsafe(newLimitBytes: bigint): Promise<bigint>;
148
+ /**
149
+ * Sets how long a salon's worker-invite link stays usable (admin only). Read when an
150
+ * invite is minted, so this never moves the expiry of links already handed out.
151
+ * @param newTtlSeconds - The new lifetime in seconds. Must be greater than 0.
152
+ * @throws Error with message `CriticalCanisterError` when there is no communication with the canister
153
+ * or when the canister code crashes during execution.
154
+ * @throws Error with message 'CanisterError' when the canister returns a business error such as validation failure. Examine "cause" field to find more details about error
155
+ * @throws Error with message `CallRefusedAtInspectionStage` when the canister's `inspect_message` rejects the call before execution (oversized payload, anonymous caller, or exceeded daily action quota) — a transport-level rejection, not a decoded Framework.Result #err.
156
+ */
157
+ setSalonInviteTtlAsyncUnsafe(newTtlSeconds: bigint): Promise<bigint>;
158
+ /**
159
+ * The invite lifetime currently in force, in seconds (admin only).
160
+ * @throws Error with message `CriticalCanisterError` when there is no communication with the canister
161
+ * or when the canister code crashes during execution.
162
+ * @throws Error with message 'CanisterError' when the canister returns a business error such as validation failure. Examine "cause" field to find more details about error
163
+ */
164
+ getSalonInviteTtlAsyncUnsafe(): Promise<bigint>;
148
165
  /**
149
166
  * Sets the #Pending video hold counted against a salon's quota before the transcoded
150
167
  * result's real size is known (admin only). Keep it in sync with octopus's output cap
@@ -1 +1 @@
1
- {"version":3,"file":"admin-actor.d.ts","sourceRoot":"","sources":["../../src/actors/admin-actor.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"admin-actor.d.ts","sourceRoot":"","sources":["../../src/actors/admin-actor.ts"],"names":[],"mappings":"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"}
@@ -200,6 +200,27 @@ export class AdminActor extends ActorBase {
200
200
  async setSalonStorageLimitAsyncUnsafe(newLimitBytes) {
201
201
  return this.executeFunctionAsyncUnsafe(() => this.actor.setSalonStorageLimit(newLimitBytes));
202
202
  }
203
+ /**
204
+ * Sets how long a salon's worker-invite link stays usable (admin only). Read when an
205
+ * invite is minted, so this never moves the expiry of links already handed out.
206
+ * @param newTtlSeconds - The new lifetime in seconds. Must be greater than 0.
207
+ * @throws Error with message `CriticalCanisterError` when there is no communication with the canister
208
+ * or when the canister code crashes during execution.
209
+ * @throws Error with message 'CanisterError' when the canister returns a business error such as validation failure. Examine "cause" field to find more details about error
210
+ * @throws Error with message `CallRefusedAtInspectionStage` when the canister's `inspect_message` rejects the call before execution (oversized payload, anonymous caller, or exceeded daily action quota) — a transport-level rejection, not a decoded Framework.Result #err.
211
+ */
212
+ async setSalonInviteTtlAsyncUnsafe(newTtlSeconds) {
213
+ return this.executeFunctionAsyncUnsafe(() => this.actor.setSalonInviteTtl(newTtlSeconds));
214
+ }
215
+ /**
216
+ * The invite lifetime currently in force, in seconds (admin only).
217
+ * @throws Error with message `CriticalCanisterError` when there is no communication with the canister
218
+ * or when the canister code crashes during execution.
219
+ * @throws Error with message 'CanisterError' when the canister returns a business error such as validation failure. Examine "cause" field to find more details about error
220
+ */
221
+ async getSalonInviteTtlAsyncUnsafe() {
222
+ return this.executeFunctionAsyncUnsafe(() => this.actor.getSalonInviteTtl());
223
+ }
203
224
  /**
204
225
  * Sets the #Pending video hold counted against a salon's quota before the transcoded
205
226
  * result's real size is known (admin only). Keep it in sync with octopus's output cap
@@ -1,18 +1,57 @@
1
1
  import { type Identity } from "@icp-sdk/core/agent";
2
2
  import type { Principal } from "@icp-sdk/core/principal";
3
3
  import { ActorBase } from "../actor-base.js";
4
- import type { UserProfileView } from "../interfaces.js";
4
+ import type { SalonInviteView, UserProfileView } from "../interfaces.js";
5
5
  export declare class HrActor extends ActorBase {
6
6
  constructor(canisterId: string, identity?: Identity);
7
7
  /**
8
- * Submits a request from the current identity to join a salon as a worker.
8
+ * Puts the current identity on a salon's candidate list. This is the ONLY way in: without
9
+ * a live invite from the salon's owner there is no way to become a candidate.
10
+ *
11
+ * It needs no existing profile — whoever follows an invite link is expected to be new
12
+ * here, so one is created on the way.
9
13
  * @param salonId - The unique identifier of the salon to join.
14
+ * @param token - The token carried by the owner's invite link. A wrong, superseded or
15
+ * expired one is refused.
10
16
  * @throws Error with message `CriticalCanisterError` when there is no communication with the canister
11
17
  * or when the canister code crashes during execution.
12
18
  * @throws Error with message 'CanisterError' when the canister returns a business error such as validation failure. Examine "cause" field to find more details about error
13
19
  * @throws Error with message `CallRefusedAtInspectionStage` when the canister's `inspect_message` rejects the call before execution (oversized payload, anonymous caller, or exceeded daily action quota) — a transport-level rejection, not a decoded Framework.Result #err.
14
20
  */
15
- requestToJoinSalonAsyncUnsafe(salonId: string): Promise<void>;
21
+ requestToJoinSalonAsyncUnsafe(salonId: string, token: string): Promise<void>;
22
+ /**
23
+ * Mints the salon's worker-invite link (owner only). REPLACES any outstanding invite, so
24
+ * the previous link stops working immediately. The lifetime comes from the app-wide admin
25
+ * setting (see AdminActor.setSalonInviteTtlAsyncUnsafe), read at mint time.
26
+ * @param salonId - The unique identifier of the salon.
27
+ * @returns A promise that resolves to the token and its expiry in canister nanoseconds.
28
+ * @throws Error with message `CriticalCanisterError` when there is no communication with the canister
29
+ * or when the canister code crashes during execution.
30
+ * @throws Error with message 'CanisterError' when the canister returns a business error such as validation failure. Examine "cause" field to find more details about error
31
+ * @throws Error with message `CallRefusedAtInspectionStage` when the canister's `inspect_message` rejects the call before execution (oversized payload, anonymous caller, or exceeded daily action quota) — a transport-level rejection, not a decoded Framework.Result #err.
32
+ */
33
+ createSalonInviteAsyncUnsafe(salonId: string): Promise<SalonInviteView>;
34
+ /**
35
+ * The salon's outstanding invite, or undefined when there is none or it has expired
36
+ * (owner only). An expired invite is reported as absent, never as a link.
37
+ * @param salonId - The unique identifier of the salon.
38
+ * @throws Error with message `CriticalCanisterError` when there is no communication with the canister
39
+ * or when the canister code crashes during execution.
40
+ * @throws Error with message 'CanisterError' when the canister returns a business error such as validation failure. Examine "cause" field to find more details about error
41
+ */
42
+ getSalonInviteAsyncUnsafe(salonId: string): Promise<SalonInviteView | undefined>;
43
+ /**
44
+ * Is this invite link still good? Answers for ANONYMOUS callers too — the page behind the
45
+ * link has to explain itself before asking anyone to log in. A wrong or expired token
46
+ * simply returns false; nothing is revealed either way. The real gate is
47
+ * `requestToJoinSalonAsyncUnsafe`, which re-checks the same token as an authenticated call.
48
+ * @param salonId - The unique identifier of the salon the link points at.
49
+ * @param token - The token carried by the link.
50
+ * @throws Error with message `CriticalCanisterError` when there is no communication with the canister
51
+ * or when the canister code crashes during execution.
52
+ * @throws Error with message 'CanisterError' when the canister returns a business error such as validation failure. Examine "cause" field to find more details about error
53
+ */
54
+ checkSalonInviteAsyncUnsafe(salonId: string, token: string): Promise<boolean>;
16
55
  /**
17
56
  * Retrieves all pending job candidates for a given salon.
18
57
  * @param salonId - The unique identifier of the salon.
@@ -1 +1 @@
1
- {"version":3,"file":"hr-actor.d.ts","sourceRoot":"","sources":["../../src/actors/hr-actor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGxD,qBAAa,OAAQ,SAAQ,SAAS;gBAEtB,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ;IAInD;;;;;;;OAOG;IACU,6BAA6B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAQ1E;;;;;;;OAOG;IACU,iCAAiC,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAQ3F;;;;;;;;OAQG;IACU,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IASzF;;;;;;;;OAQG;IACU,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAS5F;;;;;;;;OAQG;IACU,gCAAgC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IASlG;;;;;;;OAOG;IACU,8BAA8B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;CAO3F"}
1
+ {"version":3,"file":"hr-actor.d.ts","sourceRoot":"","sources":["../../src/actors/hr-actor.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAEpD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AACzD,OAAO,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AAC7C,OAAO,KAAK,EAAE,eAAe,EAAE,eAAe,EAAE,MAAM,kBAAkB,CAAC;AAGzE,qBAAa,OAAQ,SAAQ,SAAS;gBAEtB,UAAU,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,QAAQ;IAInD;;;;;;;;;;;;;OAaG;IACU,6BAA6B,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IASzF;;;;;;;;;;OAUG;IACU,4BAA4B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,CAAC;IAMpF;;;;;;;OAOG;IACU,yBAAyB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,GAAG,SAAS,CAAC;IAM7F;;;;;;;;;;OAUG;IACU,2BAA2B,CAAC,OAAO,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAS1F;;;;;;;OAOG;IACU,iCAAiC,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;IAQ3F;;;;;;;;OAQG;IACU,uBAAuB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IASzF;;;;;;;;OAQG;IACU,0BAA0B,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IAS5F;;;;;;;;OAQG;IACU,gCAAgC,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,SAAS,GAAG,OAAO,CAAC,IAAI,CAAC;IASlG;;;;;;;OAOG;IACU,8BAA8B,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAAC,eAAe,EAAE,CAAC;CAO3F"}
@@ -6,16 +6,65 @@ export class HrActor extends ActorBase {
6
6
  super(canisterId, identity);
7
7
  }
8
8
  /**
9
- * Submits a request from the current identity to join a salon as a worker.
9
+ * Puts the current identity on a salon's candidate list. This is the ONLY way in: without
10
+ * a live invite from the salon's owner there is no way to become a candidate.
11
+ *
12
+ * It needs no existing profile — whoever follows an invite link is expected to be new
13
+ * here, so one is created on the way.
10
14
  * @param salonId - The unique identifier of the salon to join.
15
+ * @param token - The token carried by the owner's invite link. A wrong, superseded or
16
+ * expired one is refused.
11
17
  * @throws Error with message `CriticalCanisterError` when there is no communication with the canister
12
18
  * or when the canister code crashes during execution.
13
19
  * @throws Error with message 'CanisterError' when the canister returns a business error such as validation failure. Examine "cause" field to find more details about error
14
20
  * @throws Error with message `CallRefusedAtInspectionStage` when the canister's `inspect_message` rejects the call before execution (oversized payload, anonymous caller, or exceeded daily action quota) — a transport-level rejection, not a decoded Framework.Result #err.
15
21
  */
16
- async requestToJoinSalonAsyncUnsafe(salonId) {
22
+ async requestToJoinSalonAsyncUnsafe(salonId, token) {
17
23
  await this.executeFunctionAsyncUnsafe(() => this.actor.requestToJoinSalon({
18
- salonId
24
+ salonId,
25
+ token
26
+ }));
27
+ }
28
+ /**
29
+ * Mints the salon's worker-invite link (owner only). REPLACES any outstanding invite, so
30
+ * the previous link stops working immediately. The lifetime comes from the app-wide admin
31
+ * setting (see AdminActor.setSalonInviteTtlAsyncUnsafe), read at mint time.
32
+ * @param salonId - The unique identifier of the salon.
33
+ * @returns A promise that resolves to the token and its expiry in canister nanoseconds.
34
+ * @throws Error with message `CriticalCanisterError` when there is no communication with the canister
35
+ * or when the canister code crashes during execution.
36
+ * @throws Error with message 'CanisterError' when the canister returns a business error such as validation failure. Examine "cause" field to find more details about error
37
+ * @throws Error with message `CallRefusedAtInspectionStage` when the canister's `inspect_message` rejects the call before execution (oversized payload, anonymous caller, or exceeded daily action quota) — a transport-level rejection, not a decoded Framework.Result #err.
38
+ */
39
+ async createSalonInviteAsyncUnsafe(salonId) {
40
+ return this.executeFunctionAsyncUnsafe(() => this.actor.createSalonInvite(salonId));
41
+ }
42
+ /**
43
+ * The salon's outstanding invite, or undefined when there is none or it has expired
44
+ * (owner only). An expired invite is reported as absent, never as a link.
45
+ * @param salonId - The unique identifier of the salon.
46
+ * @throws Error with message `CriticalCanisterError` when there is no communication with the canister
47
+ * or when the canister code crashes during execution.
48
+ * @throws Error with message 'CanisterError' when the canister returns a business error such as validation failure. Examine "cause" field to find more details about error
49
+ */
50
+ async getSalonInviteAsyncUnsafe(salonId) {
51
+ return this.executeFunctionAsyncUnsafe(() => this.actor.getSalonInvite(salonId)).then(invite => invite[0]);
52
+ }
53
+ /**
54
+ * Is this invite link still good? Answers for ANONYMOUS callers too — the page behind the
55
+ * link has to explain itself before asking anyone to log in. A wrong or expired token
56
+ * simply returns false; nothing is revealed either way. The real gate is
57
+ * `requestToJoinSalonAsyncUnsafe`, which re-checks the same token as an authenticated call.
58
+ * @param salonId - The unique identifier of the salon the link points at.
59
+ * @param token - The token carried by the link.
60
+ * @throws Error with message `CriticalCanisterError` when there is no communication with the canister
61
+ * or when the canister code crashes during execution.
62
+ * @throws Error with message 'CanisterError' when the canister returns a business error such as validation failure. Examine "cause" field to find more details about error
63
+ */
64
+ async checkSalonInviteAsyncUnsafe(salonId, token) {
65
+ return this.executeFunctionAsyncUnsafe(() => this.actor.checkSalonInvite({
66
+ salonId,
67
+ token
19
68
  }));
20
69
  }
21
70
  /**
package/dist/index.d.ts CHANGED
@@ -3,6 +3,7 @@ export { VideoUploadClient, uploadVideoToWorkersAsyncUnsafe, getSalonAssetsWithS
3
3
  export type { SalonAssetWithStatus, AssetError, AssetErrorCode, AssetFlowStatus } from "./video-upload-client.js";
4
4
  export type { VideoUploadStage, VideoUploadProgress, VideoUploadOptions, VideoUploadAcceptance, VideoUploadResult, VideoTranscodeCheck, } from "./video-upload-client.js";
5
5
  export type { ActionQuotaRole, CallActivityStats } from "./actors/admin-actor.js";
6
+ export type { SalonInviteView, UserProfileView } from "./interfaces.js";
6
7
  export { BulkActor } from "./actors/bulk-actor.js";
7
8
  export { AppointmentsActor } from "./actors/appointments-actor.js";
8
9
  export { AssetsActor } from "./actors/assets-actor.js";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,12 @@
1
1
  import type { Principal } from "@icp-sdk/core/principal";
2
+ /**
3
+ * A salon's outstanding worker-invite link. `expiresAtNs` is canister time in nanoseconds —
4
+ * divide by 1_000_000n for a JS Date.
5
+ */
6
+ export interface SalonInviteView {
7
+ token: string;
8
+ expiresAtNs: bigint;
9
+ }
2
10
  export interface UserProfileView {
3
11
  id: Principal;
4
12
  whatsAppNumber?: string;
@@ -1 +1 @@
1
- {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzD,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,SAAS,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6FAA6F;IAC7F,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB"}
1
+ {"version":3,"file":"interfaces.d.ts","sourceRoot":"","sources":["../src/interfaces.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,yBAAyB,CAAC;AAEzD;;;GAGG;AACH,MAAM,WAAW,eAAe;IAC9B,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,SAAS,CAAC;IACd,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,6FAA6F;IAC7F,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@jsm-mit/sultana-core-motoko-package",
3
- "version": "0.2.0",
3
+ "version": "0.3.0",
4
4
  "description": "A TypeScript library for interacting with the Sultana Core Motoko actor on the Internet Computer (IC) platform.",
5
5
  "homepage": "https://github.com/JSM-Sultana/sultana-core-motoko-package#readme",
6
6
  "bugs": {