@aepstore-dev/contracts 1.32.0 → 1.34.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.
package/gen/users.ts CHANGED
@@ -19,6 +19,20 @@ export enum UserFieldsType {
19
19
  UNRECOGNIZED = -1,
20
20
  }
21
21
 
22
+ /** Periods mirror PremiumPeriod enum in schema.prisma. */
23
+ export enum PremiumPeriod {
24
+ PREMIUM_PERIOD_UNSPECIFIED = 0,
25
+ PREMIUM_PERIOD_MONTH_1 = 1,
26
+ PREMIUM_PERIOD_MONTH_3 = 2,
27
+ PREMIUM_PERIOD_MONTH_6 = 3,
28
+ PREMIUM_PERIOD_MONTH_12 = 4,
29
+ UNRECOGNIZED = -1,
30
+ }
31
+
32
+ export interface Ok {
33
+ ok: boolean;
34
+ }
35
+
22
36
  export interface User {
23
37
  id: string;
24
38
  email: string;
@@ -160,6 +174,18 @@ export interface PublicProfileResponse {
160
174
  isOwner: boolean;
161
175
  /** viewer is subscribed to this profile (false when anonymous / self) */
162
176
  isSubscribed: boolean;
177
+ /**
178
+ * Premium fields — populated only when the profile owner has an active
179
+ * PremiumSubscription. Non-premium viewers and non-premium profiles see
180
+ * empty strings / false.
181
+ */
182
+ isPremium: boolean;
183
+ profileColor: string;
184
+ avatarBorder: AvatarBorder | undefined;
185
+ animatedAvatarUrl: string;
186
+ animatedBannerUrl: string;
187
+ /** ISO 8601, empty when not premium */
188
+ premiumExpiresAt: string;
163
189
  }
164
190
 
165
191
  export interface UpdateProfileRequest {
@@ -173,6 +199,14 @@ export interface UpdateProfileRequest {
173
199
  countryId: string;
174
200
  timezone: string;
175
201
  socialMedia: CreateSocialMedia[];
202
+ /**
203
+ * Premium-only fields — rejected with FAILED_PRECONDITION when the caller
204
+ * has no active premium. Empty string clears the value.
205
+ */
206
+ profileColor: string;
207
+ avatarBorderId: string;
208
+ animatedAvatarUrl: string;
209
+ animatedBannerUrl: string;
176
210
  }
177
211
 
178
212
  export interface UpdateUserRequest {
@@ -260,6 +294,298 @@ export interface SubscriptionResponse {
260
294
  subscribersCount: number;
261
295
  }
262
296
 
297
+ export interface GetMyPremiumRequest {
298
+ userId: string;
299
+ }
300
+
301
+ export interface PremiumStateResponse {
302
+ isActive: boolean;
303
+ /** ACTIVE | EXPIRED | CANCELED | empty (never purchased) */
304
+ status: string;
305
+ currentPeriod: PremiumPeriod;
306
+ /** ISO 8601, empty when never purchased */
307
+ startedAt: string;
308
+ /** ISO 8601 */
309
+ expiresAt: string;
310
+ autoRenew: boolean;
311
+ hasSavedPaymentMethod: boolean;
312
+ }
313
+
314
+ export interface SetPremiumAutoRenewRequest {
315
+ userId: string;
316
+ enabled: boolean;
317
+ }
318
+
319
+ /**
320
+ * Internal — payments-service hands us the period that was just paid for, plus
321
+ * the YooKassa payment_method id (empty for balance/non-recurring purchases).
322
+ */
323
+ export interface ActivatePremiumRequest {
324
+ userId: string;
325
+ period: PremiumPeriod;
326
+ /** empty for BALANCE / one-shot */
327
+ paymentMethodId: string;
328
+ /** false = first purchase; true = cron-driven renewal */
329
+ isRenewal: boolean;
330
+ }
331
+
332
+ export interface IsPremiumActiveRequest {
333
+ userId: string;
334
+ }
335
+
336
+ export interface IsPremiumActiveResponse {
337
+ isActive: boolean;
338
+ }
339
+
340
+ export interface AvatarBorder {
341
+ id: string;
342
+ code: string;
343
+ name: string;
344
+ description: string;
345
+ imageUrl: string;
346
+ isAnimated: boolean;
347
+ source: string;
348
+ sortOrder: number;
349
+ isActive: boolean;
350
+ }
351
+
352
+ export interface ListAvatarBordersRequest {
353
+ /** admin-only — gateway gates by role */
354
+ includeInactive: boolean;
355
+ /** optional filter */
356
+ source: string;
357
+ }
358
+
359
+ export interface ListAvatarBordersResponse {
360
+ items: AvatarBorder[];
361
+ }
362
+
363
+ export interface UpsertAvatarBorderRequest {
364
+ /** empty = create */
365
+ id: string;
366
+ /** required when creating */
367
+ code: string;
368
+ name: string;
369
+ description: string;
370
+ imageUrl: string;
371
+ isAnimated: boolean;
372
+ source: string;
373
+ sortOrder: number;
374
+ isActive: boolean;
375
+ }
376
+
377
+ export interface DeleteAvatarBorderRequest {
378
+ id: string;
379
+ }
380
+
381
+ export interface DeleteAvatarBorderResponse {
382
+ ok: boolean;
383
+ }
384
+
385
+ export interface UpdatePrivacyRequest {
386
+ userId: string;
387
+ hideEmail: boolean;
388
+ hideBalance: boolean;
389
+ hideOnline: boolean;
390
+ }
391
+
392
+ export interface UpdateEmailPrefsRequest {
393
+ userId: string;
394
+ emailOnSales: boolean;
395
+ emailOnReviews: boolean;
396
+ emailOnNews: boolean;
397
+ }
398
+
399
+ export interface UpdateEmailPrefsResponse {
400
+ emailOnSales: boolean;
401
+ emailOnReviews: boolean;
402
+ emailOnNews: boolean;
403
+ }
404
+
405
+ export interface UpdateLocaleRequest {
406
+ userId: string;
407
+ /** "ru" | "en" | ... */
408
+ locale: string;
409
+ }
410
+
411
+ export interface UpdateLocaleResponse {
412
+ locale: string;
413
+ }
414
+
415
+ export interface SoftDeleteAccountRequest {
416
+ userId: string;
417
+ /** optional, for support/audit */
418
+ reason: string;
419
+ /** 0 → use server default (30) */
420
+ cooldownDays: number;
421
+ }
422
+
423
+ export interface SoftDeleteAccountResponse {
424
+ /** ISO 8601 */
425
+ deletedAt: string;
426
+ scheduledForHardDelete: string;
427
+ }
428
+
429
+ export interface RestoreAccountRequest {
430
+ userId: string;
431
+ }
432
+
433
+ export interface HardDeletePendingRequest {
434
+ /** 0 → default 100 */
435
+ maxBatch: number;
436
+ }
437
+
438
+ export interface HardDeletePendingResponse {
439
+ deleted: number;
440
+ }
441
+
442
+ export interface ChangePasswordRequest {
443
+ userId: string;
444
+ currentPassword: string;
445
+ newPassword: string;
446
+ /** Optional: revoke all other sessions on success. */
447
+ revokeOtherSessions: boolean;
448
+ }
449
+
450
+ export interface BlockUserRequest {
451
+ blockerId: string;
452
+ blockedId: string;
453
+ /** optional */
454
+ reason: string;
455
+ }
456
+
457
+ export interface BlockUserResponse {
458
+ blocked: boolean;
459
+ }
460
+
461
+ export interface BlockedUserRow {
462
+ id: string;
463
+ username: string;
464
+ avatarUrl: string;
465
+ blockedAt: string;
466
+ reason: string;
467
+ }
468
+
469
+ export interface ListBlockedUsersRequest {
470
+ blockerId: string;
471
+ page: number;
472
+ limit: number;
473
+ }
474
+
475
+ export interface ListBlockedUsersResponse {
476
+ items: BlockedUserRow[];
477
+ total: number;
478
+ page: number;
479
+ limit: number;
480
+ }
481
+
482
+ export interface IsBlockedRequest {
483
+ blockerId: string;
484
+ blockedId: string;
485
+ }
486
+
487
+ export interface IsBlockedResponse {
488
+ isBlocked: boolean;
489
+ }
490
+
491
+ export interface DataExportRequestRow {
492
+ id: string;
493
+ userId: string;
494
+ /** PENDING | PROCESSING | READY | FAILED */
495
+ status: string;
496
+ fileUrl: string;
497
+ fileSize: number;
498
+ error: string;
499
+ createdAt: string;
500
+ completedAt: string;
501
+ }
502
+
503
+ export interface RequestDataExportRequest {
504
+ userId: string;
505
+ }
506
+
507
+ export interface ListDataExportsRequest {
508
+ userId: string;
509
+ page: number;
510
+ limit: number;
511
+ }
512
+
513
+ export interface ListDataExportsResponse {
514
+ items: DataExportRequestRow[];
515
+ total: number;
516
+ page: number;
517
+ limit: number;
518
+ }
519
+
520
+ export interface PickPendingDataExportRequest {
521
+ /** tasks-service polls; returns one PENDING row marked PROCESSING, or empty. */
522
+ Placeholder: boolean;
523
+ }
524
+
525
+ export interface CompleteDataExportRequest {
526
+ id: string;
527
+ fileUrl: string;
528
+ fileSize: number;
529
+ /** if set, marks FAILED instead of READY */
530
+ error: string;
531
+ }
532
+
533
+ export interface CollectUserExportDataRequest {
534
+ userId: string;
535
+ }
536
+
537
+ export interface CollectUserExportDataResponse {
538
+ /**
539
+ * Opaque JSON-as-string of user-owned data. tasks-service writes it to
540
+ * S3 verbatim. Keeps the schema-specific marshaling private to users-service.
541
+ */
542
+ payloadJson: string;
543
+ }
544
+
545
+ export interface GetAccountSettingsRequest {
546
+ userId: string;
547
+ }
548
+
549
+ export interface AccountSettingsResponse {
550
+ /** Identity */
551
+ id: string;
552
+ username: string;
553
+ email: string;
554
+ fullName: string;
555
+ aboutMe: string;
556
+ avatarUrl: string;
557
+ bannerUrl: string;
558
+ locale: string;
559
+ timezone: string;
560
+ countryId: string;
561
+ createdAt: string;
562
+ /** 2FA */
563
+ twoFactorType: string;
564
+ twoFactorEnabled: boolean;
565
+ backupCodesRemaining: number;
566
+ /** Privacy */
567
+ hideEmail: boolean;
568
+ hideBalance: boolean;
569
+ hideOnline: boolean;
570
+ hideSubscriptions: boolean;
571
+ /** Email prefs */
572
+ emailOnSales: boolean;
573
+ emailOnReviews: boolean;
574
+ emailOnNews: boolean;
575
+ /** Payout defaults */
576
+ payoutMethod: string;
577
+ payoutDetails: string;
578
+ /** Premium snapshot */
579
+ premiumIsActive: boolean;
580
+ premiumStatus: string;
581
+ premiumExpiresAt: string;
582
+ premiumAutoRenew: boolean;
583
+ /** Soft-delete state */
584
+ deletedAt: string;
585
+ scheduledForHardDelete: string;
586
+ socialMedia: SocialMedia[];
587
+ }
588
+
263
589
  export const USERS_V1_PACKAGE_NAME = "users.v1";
264
590
 
265
591
  export interface UsersServiceClient {
@@ -286,6 +612,96 @@ export interface UsersServiceClient {
286
612
  banUser(request: BanUserRequest): Observable<UserResponse>;
287
613
 
288
614
  unbanUser(request: UnbanUserRequest): Observable<UserResponse>;
615
+
616
+ /**
617
+ * Premium (paid). State lives in users-service; payments-service handles
618
+ * money and calls ActivatePremium (internal) on completion.
619
+ */
620
+
621
+ getMyPremium(request: GetMyPremiumRequest): Observable<PremiumStateResponse>;
622
+
623
+ setPremiumAutoRenew(request: SetPremiumAutoRenewRequest): Observable<PremiumStateResponse>;
624
+
625
+ /**
626
+ * Internal — InternalServiceGuard. Called by payments-service after a
627
+ * successful premium payment (balance or YooKassa webhook).
628
+ */
629
+
630
+ activatePremium(request: ActivatePremiumRequest): Observable<PremiumStateResponse>;
631
+
632
+ /** Internal — fast lookup for the commission engine in payments-service. */
633
+
634
+ isPremiumActive(request: IsPremiumActiveRequest): Observable<IsPremiumActiveResponse>;
635
+
636
+ /**
637
+ * Avatar borders (catalog + admin CRUD). Catalog read is public; mutations
638
+ * are admin only (gateway enforces with RolesGuard).
639
+ */
640
+
641
+ listAvatarBorders(request: ListAvatarBordersRequest): Observable<ListAvatarBordersResponse>;
642
+
643
+ upsertAvatarBorder(request: UpsertAvatarBorderRequest): Observable<AvatarBorder>;
644
+
645
+ deleteAvatarBorder(request: DeleteAvatarBorderRequest): Observable<DeleteAvatarBorderResponse>;
646
+
647
+ /** Account settings — bundled write surface for the UI. */
648
+
649
+ updatePrivacy(request: UpdatePrivacyRequest): Observable<PublicProfileResponse>;
650
+
651
+ updateEmailPrefs(request: UpdateEmailPrefsRequest): Observable<UpdateEmailPrefsResponse>;
652
+
653
+ updateLocale(request: UpdateLocaleRequest): Observable<UpdateLocaleResponse>;
654
+
655
+ /**
656
+ * Soft-delete + restore. Internal AuthService also queries the soft-delete
657
+ * state on login (rejects if deletedAt set).
658
+ */
659
+
660
+ softDeleteAccount(request: SoftDeleteAccountRequest): Observable<SoftDeleteAccountResponse>;
661
+
662
+ restoreAccount(request: RestoreAccountRequest): Observable<UserResponse>;
663
+
664
+ /** tasks-service cron */
665
+
666
+ hardDeletePending(request: HardDeletePendingRequest): Observable<HardDeletePendingResponse>;
667
+
668
+ /** Blocks */
669
+
670
+ blockUser(request: BlockUserRequest): Observable<BlockUserResponse>;
671
+
672
+ unblockUser(request: BlockUserRequest): Observable<BlockUserResponse>;
673
+
674
+ listBlockedUsers(request: ListBlockedUsersRequest): Observable<ListBlockedUsersResponse>;
675
+
676
+ /** internal lookup */
677
+
678
+ isBlocked(request: IsBlockedRequest): Observable<IsBlockedResponse>;
679
+
680
+ /** Data export */
681
+
682
+ requestDataExport(request: RequestDataExportRequest): Observable<DataExportRequestRow>;
683
+
684
+ listDataExports(request: ListDataExportsRequest): Observable<ListDataExportsResponse>;
685
+
686
+ /** tasks-service */
687
+
688
+ pickPendingDataExport(request: PickPendingDataExportRequest): Observable<DataExportRequestRow>;
689
+
690
+ /** tasks-service */
691
+
692
+ completeDataExport(request: CompleteDataExportRequest): Observable<DataExportRequestRow>;
693
+
694
+ /** tasks-service */
695
+
696
+ collectUserExportData(request: CollectUserExportDataRequest): Observable<CollectUserExportDataResponse>;
697
+
698
+ /** Unified read for the settings page */
699
+
700
+ getAccountSettings(request: GetAccountSettingsRequest): Observable<AccountSettingsResponse>;
701
+
702
+ /** Password — separate from generic createCode/verifyCode reset flow. */
703
+
704
+ changePassword(request: ChangePasswordRequest): Observable<Ok>;
289
705
  }
290
706
 
291
707
  export interface UsersServiceController {
@@ -326,6 +742,136 @@ export interface UsersServiceController {
326
742
  banUser(request: BanUserRequest): Promise<UserResponse> | Observable<UserResponse> | UserResponse;
327
743
 
328
744
  unbanUser(request: UnbanUserRequest): Promise<UserResponse> | Observable<UserResponse> | UserResponse;
745
+
746
+ /**
747
+ * Premium (paid). State lives in users-service; payments-service handles
748
+ * money and calls ActivatePremium (internal) on completion.
749
+ */
750
+
751
+ getMyPremium(
752
+ request: GetMyPremiumRequest,
753
+ ): Promise<PremiumStateResponse> | Observable<PremiumStateResponse> | PremiumStateResponse;
754
+
755
+ setPremiumAutoRenew(
756
+ request: SetPremiumAutoRenewRequest,
757
+ ): Promise<PremiumStateResponse> | Observable<PremiumStateResponse> | PremiumStateResponse;
758
+
759
+ /**
760
+ * Internal — InternalServiceGuard. Called by payments-service after a
761
+ * successful premium payment (balance or YooKassa webhook).
762
+ */
763
+
764
+ activatePremium(
765
+ request: ActivatePremiumRequest,
766
+ ): Promise<PremiumStateResponse> | Observable<PremiumStateResponse> | PremiumStateResponse;
767
+
768
+ /** Internal — fast lookup for the commission engine in payments-service. */
769
+
770
+ isPremiumActive(
771
+ request: IsPremiumActiveRequest,
772
+ ): Promise<IsPremiumActiveResponse> | Observable<IsPremiumActiveResponse> | IsPremiumActiveResponse;
773
+
774
+ /**
775
+ * Avatar borders (catalog + admin CRUD). Catalog read is public; mutations
776
+ * are admin only (gateway enforces with RolesGuard).
777
+ */
778
+
779
+ listAvatarBorders(
780
+ request: ListAvatarBordersRequest,
781
+ ): Promise<ListAvatarBordersResponse> | Observable<ListAvatarBordersResponse> | ListAvatarBordersResponse;
782
+
783
+ upsertAvatarBorder(
784
+ request: UpsertAvatarBorderRequest,
785
+ ): Promise<AvatarBorder> | Observable<AvatarBorder> | AvatarBorder;
786
+
787
+ deleteAvatarBorder(
788
+ request: DeleteAvatarBorderRequest,
789
+ ): Promise<DeleteAvatarBorderResponse> | Observable<DeleteAvatarBorderResponse> | DeleteAvatarBorderResponse;
790
+
791
+ /** Account settings — bundled write surface for the UI. */
792
+
793
+ updatePrivacy(
794
+ request: UpdatePrivacyRequest,
795
+ ): Promise<PublicProfileResponse> | Observable<PublicProfileResponse> | PublicProfileResponse;
796
+
797
+ updateEmailPrefs(
798
+ request: UpdateEmailPrefsRequest,
799
+ ): Promise<UpdateEmailPrefsResponse> | Observable<UpdateEmailPrefsResponse> | UpdateEmailPrefsResponse;
800
+
801
+ updateLocale(
802
+ request: UpdateLocaleRequest,
803
+ ): Promise<UpdateLocaleResponse> | Observable<UpdateLocaleResponse> | UpdateLocaleResponse;
804
+
805
+ /**
806
+ * Soft-delete + restore. Internal AuthService also queries the soft-delete
807
+ * state on login (rejects if deletedAt set).
808
+ */
809
+
810
+ softDeleteAccount(
811
+ request: SoftDeleteAccountRequest,
812
+ ): Promise<SoftDeleteAccountResponse> | Observable<SoftDeleteAccountResponse> | SoftDeleteAccountResponse;
813
+
814
+ restoreAccount(request: RestoreAccountRequest): Promise<UserResponse> | Observable<UserResponse> | UserResponse;
815
+
816
+ /** tasks-service cron */
817
+
818
+ hardDeletePending(
819
+ request: HardDeletePendingRequest,
820
+ ): Promise<HardDeletePendingResponse> | Observable<HardDeletePendingResponse> | HardDeletePendingResponse;
821
+
822
+ /** Blocks */
823
+
824
+ blockUser(request: BlockUserRequest): Promise<BlockUserResponse> | Observable<BlockUserResponse> | BlockUserResponse;
825
+
826
+ unblockUser(
827
+ request: BlockUserRequest,
828
+ ): Promise<BlockUserResponse> | Observable<BlockUserResponse> | BlockUserResponse;
829
+
830
+ listBlockedUsers(
831
+ request: ListBlockedUsersRequest,
832
+ ): Promise<ListBlockedUsersResponse> | Observable<ListBlockedUsersResponse> | ListBlockedUsersResponse;
833
+
834
+ /** internal lookup */
835
+
836
+ isBlocked(request: IsBlockedRequest): Promise<IsBlockedResponse> | Observable<IsBlockedResponse> | IsBlockedResponse;
837
+
838
+ /** Data export */
839
+
840
+ requestDataExport(
841
+ request: RequestDataExportRequest,
842
+ ): Promise<DataExportRequestRow> | Observable<DataExportRequestRow> | DataExportRequestRow;
843
+
844
+ listDataExports(
845
+ request: ListDataExportsRequest,
846
+ ): Promise<ListDataExportsResponse> | Observable<ListDataExportsResponse> | ListDataExportsResponse;
847
+
848
+ /** tasks-service */
849
+
850
+ pickPendingDataExport(
851
+ request: PickPendingDataExportRequest,
852
+ ): Promise<DataExportRequestRow> | Observable<DataExportRequestRow> | DataExportRequestRow;
853
+
854
+ /** tasks-service */
855
+
856
+ completeDataExport(
857
+ request: CompleteDataExportRequest,
858
+ ): Promise<DataExportRequestRow> | Observable<DataExportRequestRow> | DataExportRequestRow;
859
+
860
+ /** tasks-service */
861
+
862
+ collectUserExportData(
863
+ request: CollectUserExportDataRequest,
864
+ ): Promise<CollectUserExportDataResponse> | Observable<CollectUserExportDataResponse> | CollectUserExportDataResponse;
865
+
866
+ /** Unified read for the settings page */
867
+
868
+ getAccountSettings(
869
+ request: GetAccountSettingsRequest,
870
+ ): Promise<AccountSettingsResponse> | Observable<AccountSettingsResponse> | AccountSettingsResponse;
871
+
872
+ /** Password — separate from generic createCode/verifyCode reset flow. */
873
+
874
+ changePassword(request: ChangePasswordRequest): Promise<Ok> | Observable<Ok> | Ok;
329
875
  }
330
876
 
331
877
  export function UsersServiceControllerMethods() {
@@ -343,6 +889,30 @@ export function UsersServiceControllerMethods() {
343
889
  "deleteSubscription",
344
890
  "banUser",
345
891
  "unbanUser",
892
+ "getMyPremium",
893
+ "setPremiumAutoRenew",
894
+ "activatePremium",
895
+ "isPremiumActive",
896
+ "listAvatarBorders",
897
+ "upsertAvatarBorder",
898
+ "deleteAvatarBorder",
899
+ "updatePrivacy",
900
+ "updateEmailPrefs",
901
+ "updateLocale",
902
+ "softDeleteAccount",
903
+ "restoreAccount",
904
+ "hardDeletePending",
905
+ "blockUser",
906
+ "unblockUser",
907
+ "listBlockedUsers",
908
+ "isBlocked",
909
+ "requestDataExport",
910
+ "listDataExports",
911
+ "pickPendingDataExport",
912
+ "completeDataExport",
913
+ "collectUserExportData",
914
+ "getAccountSettings",
915
+ "changePassword",
346
916
  ];
347
917
  for (const method of grpcMethods) {
348
918
  const descriptor: any = Reflect.getOwnPropertyDescriptor(constructor.prototype, method);
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@aepstore-dev/contracts",
3
- "version": "1.32.0",
3
+ "version": "1.34.0",
4
4
  "description": "Protobuf definitions for aepstore microservices",
5
5
  "main": "./dist/index.js",
6
6
  "types": "./dist/index.d.ts",