@remnawave/backend-contract 0.0.5 → 0.0.7

Sign up to get free protection for your applications and to get access to all the features.
@@ -2,7 +2,7 @@ export const USERS_CONTROLLER = 'users' as const;
2
2
 
3
3
  export const USERS_ROUTES = {
4
4
  CREATE: '',
5
- GET_BY_UUID: '/:uuid',
5
+ GET_BY_UUID: '',
6
6
  GET_BY_SHORT_UUID: 'short-uuid/:shortUuid',
7
7
  GET_BY_SUBSCRIPTION_UUID: 'sub-uuid/:subscriptionUuid',
8
8
  GET_ALL: '',
@@ -10,4 +10,5 @@ export const USERS_ROUTES = {
10
10
  DISABLE_USER: '/disable/:uuid',
11
11
  ENABLE_USER: '/enable/:uuid',
12
12
  DELETE_USER: '/delete/:uuid',
13
+ UPDATE: '/update',
13
14
  } as const;
package/api/routes.ts CHANGED
@@ -55,6 +55,7 @@ export const REST_API = {
55
55
  `${ROOT}/${CONTROLLERS.USERS_CONTROLLER}/${CONTROLLERS.USERS_ROUTES.ENABLE_USER}/${uuid}`,
56
56
  DELETE_USER: (uuid: string) =>
57
57
  `${ROOT}/${CONTROLLERS.USERS_CONTROLLER}/${CONTROLLERS.USERS_ROUTES.DELETE_USER}/${uuid}`,
58
+ UPDATE: `${ROOT}/${CONTROLLERS.USERS_CONTROLLER}/${CONTROLLERS.USERS_ROUTES.UPDATE}`,
58
59
  },
59
60
  SUBSCRIPTION: {
60
61
  GET: (shortUuid: string) =>
@@ -4,7 +4,7 @@ exports.USERS_ROUTES = exports.USERS_CONTROLLER = void 0;
4
4
  exports.USERS_CONTROLLER = 'users';
5
5
  exports.USERS_ROUTES = {
6
6
  CREATE: '',
7
- GET_BY_UUID: '/:uuid',
7
+ GET_BY_UUID: '',
8
8
  GET_BY_SHORT_UUID: 'short-uuid/:shortUuid',
9
9
  GET_BY_SUBSCRIPTION_UUID: 'sub-uuid/:subscriptionUuid',
10
10
  GET_ALL: '',
@@ -12,4 +12,5 @@ exports.USERS_ROUTES = {
12
12
  DISABLE_USER: '/disable/:uuid',
13
13
  ENABLE_USER: '/enable/:uuid',
14
14
  DELETE_USER: '/delete/:uuid',
15
+ UPDATE: '/update',
15
16
  };
@@ -76,6 +76,7 @@ exports.REST_API = {
76
76
  DISABLE_USER: (uuid) => `${exports.ROOT}/${CONTROLLERS.USERS_CONTROLLER}/${CONTROLLERS.USERS_ROUTES.DISABLE_USER}/${uuid}`,
77
77
  ENABLE_USER: (uuid) => `${exports.ROOT}/${CONTROLLERS.USERS_CONTROLLER}/${CONTROLLERS.USERS_ROUTES.ENABLE_USER}/${uuid}`,
78
78
  DELETE_USER: (uuid) => `${exports.ROOT}/${CONTROLLERS.USERS_CONTROLLER}/${CONTROLLERS.USERS_ROUTES.DELETE_USER}/${uuid}`,
79
+ UPDATE: `${exports.ROOT}/${CONTROLLERS.USERS_CONTROLLER}/${CONTROLLERS.USERS_ROUTES.UPDATE}`,
79
80
  },
80
81
  SUBSCRIPTION: {
81
82
  GET: (shortUuid) => `${exports.ROOT}/${CONTROLLERS.SUBSCRIPTION_CONTROLLER}/${CONTROLLERS.SUBSCRIPTION_ROUTES.GET}/${shortUuid}`,
@@ -23,3 +23,4 @@ __exportStar(require("./get-user-by-short-uuid.command"), exports);
23
23
  __exportStar(require("./get-user-by-subscription-uuid.command"), exports);
24
24
  __exportStar(require("./get-user-by-uuid.command"), exports);
25
25
  __exportStar(require("./revoke-user-subscription.command"), exports);
26
+ __exportStar(require("./update-user.command"), exports);
@@ -0,0 +1,58 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.UpdateUserCommand = void 0;
4
+ const zod_1 = require("zod");
5
+ const api_1 = require("../../api");
6
+ const constants_1 = require("../../constants");
7
+ const models_1 = require("../../models");
8
+ var UpdateUserCommand;
9
+ (function (UpdateUserCommand) {
10
+ UpdateUserCommand.url = api_1.REST_API.USERS.UPDATE;
11
+ UpdateUserCommand.RequestSchema = models_1.UsersSchema.pick({
12
+ uuid: true,
13
+ }).extend({
14
+ status: models_1.UsersSchema.shape.status.optional(),
15
+ trafficLimitBytes: zod_1.z
16
+ .number({
17
+ invalid_type_error: 'Traffic limit must be a number',
18
+ })
19
+ .int('Traffic limit must be an integer')
20
+ .min(0, 'Traffic limit must be greater than 0')
21
+ .describe('Traffic limit in bytes. 0 - unlimited')
22
+ .optional(),
23
+ trafficLimitStrategy: models_1.UsersSchema.shape.trafficLimitStrategy
24
+ .describe('Traffic limit reset strategy')
25
+ .optional()
26
+ .default(constants_1.RESET_PERIODS.NO_RESET)
27
+ .superRefine((val, ctx) => {
28
+ if (val && !Object.values(constants_1.RESET_PERIODS).includes(val)) {
29
+ ctx.addIssue({
30
+ code: zod_1.z.ZodIssueCode.invalid_enum_value,
31
+ message: 'Invalid traffic limit strategy',
32
+ path: ['trafficLimitStrategy'],
33
+ received: val,
34
+ options: Object.values(constants_1.RESET_PERIODS),
35
+ });
36
+ }
37
+ }),
38
+ enabledInbounds: zod_1.z
39
+ .array(models_1.InboundsSchema.pick({
40
+ uuid: true,
41
+ }), {
42
+ invalid_type_error: 'Enabled inbounds must be an array',
43
+ })
44
+ .optional(),
45
+ expireAt: zod_1.z.coerce
46
+ .date({
47
+ required_error: 'Expiration date is required',
48
+ invalid_type_error: 'Invalid expiration date format',
49
+ })
50
+ .refine((date) => date > new Date(), {
51
+ message: 'Expiration date cannot be in the past',
52
+ })
53
+ .optional(),
54
+ });
55
+ UpdateUserCommand.ResponseSchema = zod_1.z.object({
56
+ response: models_1.UsersSchema,
57
+ });
58
+ })(UpdateUserCommand || (exports.UpdateUserCommand = UpdateUserCommand = {}));
@@ -238,4 +238,9 @@ exports.ERRORS = {
238
238
  message: 'Get user stats error',
239
239
  httpCode: 500,
240
240
  },
241
+ UPDATE_USER_WITH_INBOUNDS_ERROR: {
242
+ code: 'A049',
243
+ message: 'Update user with inbounds error',
244
+ httpCode: 500,
245
+ },
241
246
  };
@@ -7,3 +7,4 @@ export * from './get-user-by-short-uuid.command';
7
7
  export * from './get-user-by-subscription-uuid.command';
8
8
  export * from './get-user-by-uuid.command';
9
9
  export * from './revoke-user-subscription.command';
10
+ export * from './update-user.command';
@@ -0,0 +1,64 @@
1
+ import { z } from 'zod';
2
+ import { REST_API } from '../../api';
3
+ import { RESET_PERIODS } from '../../constants';
4
+ import { InboundsSchema, UsersSchema } from '../../models';
5
+
6
+ export namespace UpdateUserCommand {
7
+ export const url = REST_API.USERS.UPDATE;
8
+
9
+ export const RequestSchema = UsersSchema.pick({
10
+ uuid: true,
11
+ }).extend({
12
+ status: UsersSchema.shape.status.optional(),
13
+ trafficLimitBytes: z
14
+ .number({
15
+ invalid_type_error: 'Traffic limit must be a number',
16
+ })
17
+ .int('Traffic limit must be an integer')
18
+ .min(0, 'Traffic limit must be greater than 0')
19
+ .describe('Traffic limit in bytes. 0 - unlimited')
20
+ .optional(),
21
+ trafficLimitStrategy: UsersSchema.shape.trafficLimitStrategy
22
+ .describe('Traffic limit reset strategy')
23
+ .optional()
24
+ .default(RESET_PERIODS.NO_RESET)
25
+ .superRefine((val, ctx) => {
26
+ if (val && !Object.values(RESET_PERIODS).includes(val)) {
27
+ ctx.addIssue({
28
+ code: z.ZodIssueCode.invalid_enum_value,
29
+ message: 'Invalid traffic limit strategy',
30
+ path: ['trafficLimitStrategy'],
31
+ received: val,
32
+ options: Object.values(RESET_PERIODS),
33
+ });
34
+ }
35
+ }),
36
+ enabledInbounds: z
37
+ .array(
38
+ InboundsSchema.pick({
39
+ uuid: true,
40
+ }),
41
+ {
42
+ invalid_type_error: 'Enabled inbounds must be an array',
43
+ },
44
+ )
45
+ .optional(),
46
+ expireAt: z.coerce
47
+ .date({
48
+ required_error: 'Expiration date is required',
49
+ invalid_type_error: 'Invalid expiration date format',
50
+ })
51
+ .refine((date) => date > new Date(), {
52
+ message: 'Expiration date cannot be in the past',
53
+ })
54
+ .optional(),
55
+ });
56
+
57
+ export type Request = z.infer<typeof RequestSchema>;
58
+
59
+ export const ResponseSchema = z.object({
60
+ response: UsersSchema,
61
+ });
62
+
63
+ export type Response = z.infer<typeof ResponseSchema>;
64
+ }
@@ -235,4 +235,9 @@ export const ERRORS = {
235
235
  message: 'Get user stats error',
236
236
  httpCode: 500,
237
237
  },
238
+ UPDATE_USER_WITH_INBOUNDS_ERROR: {
239
+ code: 'A049',
240
+ message: 'Update user with inbounds error',
241
+ httpCode: 500,
242
+ },
238
243
  } as const;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@remnawave/backend-contract",
3
- "version": "0.0.5",
3
+ "version": "0.0.7",
4
4
  "description": "A contract library for Remnawave",
5
5
  "main": "index.js",
6
6
  "scripts": {