@sorokchat-messenger/contracts 1.0.6 → 1.0.8

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 (33) hide show
  1. package/dist/authorization/authorized.schema.d.ts +6 -0
  2. package/dist/authorization/authorized.schema.d.ts.map +1 -0
  3. package/dist/authorization/authorized.schema.js +9 -0
  4. package/dist/authorization/authorized.schema.js.map +1 -0
  5. package/dist/authorization/codes.d.ts +4 -0
  6. package/dist/authorization/codes.d.ts.map +1 -1
  7. package/dist/authorization/codes.js +5 -0
  8. package/dist/authorization/codes.js.map +1 -1
  9. package/dist/authorization/index.d.ts +1 -0
  10. package/dist/authorization/index.d.ts.map +1 -1
  11. package/dist/authorization/index.js +1 -0
  12. package/dist/authorization/index.js.map +1 -1
  13. package/dist/authorization/login.schema.d.ts +2 -2
  14. package/dist/authorization/login.schema.d.ts.map +1 -1
  15. package/dist/authorization/login.schema.js +4 -1
  16. package/dist/authorization/login.schema.js.map +1 -1
  17. package/dist/authorization/register.schema.d.ts +2 -2
  18. package/dist/authorization/register.schema.d.ts.map +1 -1
  19. package/dist/authorization/register.schema.js +4 -1
  20. package/dist/authorization/register.schema.js.map +1 -1
  21. package/dist/common/role-hierarchy.util.d.ts +9 -0
  22. package/dist/common/role-hierarchy.util.d.ts.map +1 -0
  23. package/dist/common/role-hierarchy.util.js +40 -0
  24. package/dist/common/role-hierarchy.util.js.map +1 -0
  25. package/dist/common/role.hierarchy.util.spec.d.ts +2 -0
  26. package/dist/common/role.hierarchy.util.spec.d.ts.map +1 -0
  27. package/dist/common/role.hierarchy.util.spec.js +36 -0
  28. package/dist/common/role.hierarchy.util.spec.js.map +1 -0
  29. package/dist/users/new-user.schema.d.ts +2 -2
  30. package/dist/users/new-user.schema.d.ts.map +1 -1
  31. package/dist/users/new-user.schema.js +13 -9
  32. package/dist/users/new-user.schema.js.map +1 -1
  33. package/package.json +6 -2
@@ -0,0 +1,6 @@
1
+ import z from "zod";
2
+ export declare const AuthorizedSchema: z.ZodObject<{
3
+ accessToken: z.ZodString;
4
+ }, z.core.$strip>;
5
+ export type AuthorizedPayload = z.infer<typeof AuthorizedSchema>;
6
+ //# sourceMappingURL=authorized.schema.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorized.schema.d.ts","sourceRoot":"","sources":["../../src/authorization/authorized.schema.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AAKpB,eAAO,MAAM,gBAAgB;;iBAI3B,CAAC;AAEH,MAAM,MAAM,iBAAiB,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,gBAAgB,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ import z from "zod";
2
+ import { AuthorizationCodes } from "./codes.js";
3
+ const JWT_REGEXP = /^[A-Za-z0-9_-]{2,}\.[A-Za-z0-9_-]{2,}\.[A-Za-z0-9_-]+$/;
4
+ export const AuthorizedSchema = z.object({
5
+ accessToken: z
6
+ .string({ error: AuthorizationCodes.ACCESS_TOKEN.UNDEFINED })
7
+ .regex(JWT_REGEXP, { error: AuthorizationCodes.ACCESS_TOKEN.NOT_JWT }),
8
+ });
9
+ //# sourceMappingURL=authorized.schema.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authorized.schema.js","sourceRoot":"","sources":["../../src/authorization/authorized.schema.ts"],"names":[],"mappings":"AAAA,OAAO,CAAC,MAAM,KAAK,CAAC;AACpB,OAAO,EAAE,kBAAkB,EAAE,MAAM,YAAY,CAAC;AAEhD,MAAM,UAAU,GAAG,wDAAwD,CAAC;AAE5E,MAAM,CAAC,MAAM,gBAAgB,GAAG,CAAC,CAAC,MAAM,CAAC;IACvC,WAAW,EAAE,CAAC;SACX,MAAM,CAAC,EAAE,KAAK,EAAE,kBAAkB,CAAC,YAAY,CAAC,SAAS,EAAE,CAAC;SAC5D,KAAK,CAAC,UAAU,EAAE,EAAE,KAAK,EAAE,kBAAkB,CAAC,YAAY,CAAC,OAAO,EAAE,CAAC;CACzE,CAAC,CAAC"}
@@ -2,5 +2,9 @@ export declare const AuthorizationCodes: {
2
2
  readonly BAD_CREDENTIALS: `${string}.bad-credentials`;
3
3
  readonly ACCESS_DENIED: `${string}.access-denied`;
4
4
  readonly UNAUTHORIZED: `${string}.unauthorized`;
5
+ readonly ACCESS_TOKEN: {
6
+ readonly UNDEFINED: `${string}.undefined`;
7
+ readonly NOT_JWT: `${string}.not-jwt`;
8
+ };
5
9
  };
6
10
  //# sourceMappingURL=codes.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"codes.d.ts","sourceRoot":"","sources":["../../src/authorization/codes.ts"],"names":[],"mappings":"AAIA,eAAO,MAAM,kBAAkB;aAC7B,eAAe;aACf,aAAa;aACb,YAAY;CACJ,CAAC"}
1
+ {"version":3,"file":"codes.d.ts","sourceRoot":"","sources":["../../src/authorization/codes.ts"],"names":[],"mappings":"AAKA,eAAO,MAAM,kBAAkB;aAC7B,eAAe;aACf,aAAa;aACb,YAAY;aACZ,YAAY;iBACV,SAAS;iBACT,OAAO;;CAED,CAAC"}
@@ -1,8 +1,13 @@
1
1
  import { ERROR_CODE } from "../common/index.js";
2
2
  const AUTHORIZATION_ERROR = `${ERROR_CODE}.authorization`;
3
+ const ACCESS_TOKEN_ERROR = `${ERROR_CODE}.access-token`;
3
4
  export const AuthorizationCodes = {
4
5
  BAD_CREDENTIALS: `${AUTHORIZATION_ERROR}.bad-credentials`,
5
6
  ACCESS_DENIED: `${AUTHORIZATION_ERROR}.access-denied`,
6
7
  UNAUTHORIZED: `${AUTHORIZATION_ERROR}.unauthorized`,
8
+ ACCESS_TOKEN: {
9
+ UNDEFINED: `${ACCESS_TOKEN_ERROR}.undefined`,
10
+ NOT_JWT: `${ACCESS_TOKEN_ERROR}.not-jwt`,
11
+ },
7
12
  };
8
13
  //# sourceMappingURL=codes.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"codes.js","sourceRoot":"","sources":["../../src/authorization/codes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,MAAM,mBAAmB,GAAW,GAAG,UAAU,gBAAgB,CAAC;AAElE,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,eAAe,EAAE,GAAG,mBAAmB,kBAAkB;IACzD,aAAa,EAAE,GAAG,mBAAmB,gBAAgB;IACrD,YAAY,EAAE,GAAG,mBAAmB,eAAe;CAC3C,CAAC"}
1
+ {"version":3,"file":"codes.js","sourceRoot":"","sources":["../../src/authorization/codes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAEhD,MAAM,mBAAmB,GAAW,GAAG,UAAU,gBAAgB,CAAC;AAClE,MAAM,kBAAkB,GAAW,GAAG,UAAU,eAAe,CAAC;AAEhE,MAAM,CAAC,MAAM,kBAAkB,GAAG;IAChC,eAAe,EAAE,GAAG,mBAAmB,kBAAkB;IACzD,aAAa,EAAE,GAAG,mBAAmB,gBAAgB;IACrD,YAAY,EAAE,GAAG,mBAAmB,eAAe;IACnD,YAAY,EAAE;QACZ,SAAS,EAAE,GAAG,kBAAkB,YAAY;QAC5C,OAAO,EAAE,GAAG,kBAAkB,UAAU;KACzC;CACO,CAAC"}
@@ -2,4 +2,5 @@ export * from "./codes.js";
2
2
  export * from "./register.schema.js";
3
3
  export * from "./login.schema.js";
4
4
  export * from "./controller.js";
5
+ export * from "./authorized.schema.js";
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/authorization/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/authorization/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC"}
@@ -2,4 +2,5 @@ export * from "./codes.js";
2
2
  export * from "./register.schema.js";
3
3
  export * from "./login.schema.js";
4
4
  export * from "./controller.js";
5
+ export * from "./authorized.schema.js";
5
6
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/authorization/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/authorization/index.ts"],"names":[],"mappings":"AAAA,cAAc,YAAY,CAAC;AAC3B,cAAc,sBAAsB,CAAC;AACrC,cAAc,mBAAmB,CAAC;AAClC,cAAc,iBAAiB,CAAC;AAChC,cAAc,wBAAwB,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import type z from "zod";
2
2
  export declare const LoginSchema: z.ZodObject<{
3
- login: z.ZodNonOptional<z.ZodString>;
4
- password: z.ZodNonOptional<z.ZodString>;
3
+ login: z.ZodString;
4
+ password: z.ZodString;
5
5
  }, z.core.$strip>;
6
6
  export type LoginPayload = z.infer<typeof LoginSchema>;
7
7
  //# sourceMappingURL=login.schema.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"login.schema.d.ts","sourceRoot":"","sources":["../../src/authorization/login.schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAGzB,eAAO,MAAM,WAAW;;;iBAGM,CAAC;AAC/B,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC"}
1
+ {"version":3,"file":"login.schema.d.ts","sourceRoot":"","sources":["../../src/authorization/login.schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAGzB,eAAO,MAAM,WAAW;;;iBAMtB,CAAC;AACH,MAAM,MAAM,YAAY,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,WAAW,CAAC,CAAC"}
@@ -2,5 +2,8 @@ import { NewUserSchema } from "../users/index.js";
2
2
  export const LoginSchema = NewUserSchema.pick({
3
3
  login: true,
4
4
  password: true,
5
- }).meta({ id: "LoginSchema" });
5
+ }).meta({
6
+ id: "LoginSchema",
7
+ description: "Данні для входу користувача у систему",
8
+ });
6
9
  //# sourceMappingURL=login.schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"login.schema.js","sourceRoot":"","sources":["../../src/authorization/login.schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,CAAC;IAC5C,KAAK,EAAE,IAAI;IACX,QAAQ,EAAE,IAAI;CACf,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,aAAa,EAAE,CAAC,CAAC"}
1
+ {"version":3,"file":"login.schema.js","sourceRoot":"","sources":["../../src/authorization/login.schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,CAAC,MAAM,WAAW,GAAG,aAAa,CAAC,IAAI,CAAC;IAC5C,KAAK,EAAE,IAAI;IACX,QAAQ,EAAE,IAAI;CACf,CAAC,CAAC,IAAI,CAAC;IACN,EAAE,EAAE,aAAa;IACjB,WAAW,EAAE,uCAAuC;CACrD,CAAC,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import type z from "zod";
2
2
  export declare const RegisterSchema: z.ZodObject<{
3
- login: z.ZodNonOptional<z.ZodString>;
4
- password: z.ZodNonOptional<z.ZodString>;
3
+ login: z.ZodString;
4
+ password: z.ZodString;
5
5
  displayName: z.ZodOptional<z.ZodString>;
6
6
  }, z.core.$strip>;
7
7
  export type RegisterPayload = z.infer<typeof RegisterSchema>;
@@ -1 +1 @@
1
- {"version":3,"file":"register.schema.d.ts","sourceRoot":"","sources":["../../src/authorization/register.schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAGzB,eAAO,MAAM,cAAc;;;;iBAIM,CAAC;AAClC,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC"}
1
+ {"version":3,"file":"register.schema.d.ts","sourceRoot":"","sources":["../../src/authorization/register.schema.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,CAAC,MAAM,KAAK,CAAC;AAGzB,eAAO,MAAM,cAAc;;;;iBAOzB,CAAC;AACH,MAAM,MAAM,eAAe,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,cAAc,CAAC,CAAC"}
@@ -3,5 +3,8 @@ export const RegisterSchema = NewUserSchema.pick({
3
3
  login: true,
4
4
  password: true,
5
5
  displayName: true,
6
- }).meta({ id: "RegisterSchema" });
6
+ }).meta({
7
+ id: "RegisterSchema",
8
+ description: "Данні для реєстрації користувача у системі",
9
+ });
7
10
  //# sourceMappingURL=register.schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"register.schema.js","sourceRoot":"","sources":["../../src/authorization/register.schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC;IAC/C,KAAK,EAAE,IAAI;IACX,QAAQ,EAAE,IAAI;IACd,WAAW,EAAE,IAAI;CAClB,CAAC,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,gBAAgB,EAAE,CAAC,CAAC"}
1
+ {"version":3,"file":"register.schema.js","sourceRoot":"","sources":["../../src/authorization/register.schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,mBAAmB,CAAC;AAElD,MAAM,CAAC,MAAM,cAAc,GAAG,aAAa,CAAC,IAAI,CAAC;IAC/C,KAAK,EAAE,IAAI;IACX,QAAQ,EAAE,IAAI;IACd,WAAW,EAAE,IAAI;CAClB,CAAC,CAAC,IAAI,CAAC;IACN,EAAE,EAAE,gBAAgB;IACpB,WAAW,EAAE,4CAA4C;CAC1D,CAAC,CAAC"}
@@ -0,0 +1,9 @@
1
+ export declare class RoleHierarchy {
2
+ private readonly map;
3
+ private readonly cache;
4
+ constructor(map: Map<string, string[]>);
5
+ hasRole(needRole: string, currentRole: string): boolean;
6
+ private save;
7
+ private generateKey;
8
+ }
9
+ //# sourceMappingURL=role-hierarchy.util.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-hierarchy.util.d.ts","sourceRoot":"","sources":["../../src/common/role-hierarchy.util.ts"],"names":[],"mappings":"AAAA,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,GAAG,CAAwB;IAC5C,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAuB;IAE7C,YAAmB,GAAG,EAAE,GAAG,CAAC,MAAM,EAAE,MAAM,EAAE,CAAC,EAQ5C;IAEM,OAAO,CAAC,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,OAAO,CAsB7D;IAED,OAAO,CAAC,IAAI;IAIZ,OAAO,CAAC,WAAW;CAGpB"}
@@ -0,0 +1,40 @@
1
+ export class RoleHierarchy {
2
+ map;
3
+ cache;
4
+ constructor(map) {
5
+ this.map = new Map([...map.entries()].map(([role, inheritedRoles]) => [
6
+ role,
7
+ [...inheritedRoles],
8
+ ]));
9
+ this.cache = new Map();
10
+ }
11
+ hasRole(needRole, currentRole) {
12
+ const key = this.generateKey(currentRole, needRole);
13
+ const fromCache = this.cache.get(key);
14
+ if (fromCache !== undefined)
15
+ return fromCache;
16
+ if (needRole === currentRole) {
17
+ this.save(key, true);
18
+ return true;
19
+ }
20
+ const currentRoles = this.map.get(currentRole);
21
+ if (!currentRoles) {
22
+ this.save(key, false);
23
+ return false;
24
+ }
25
+ if (currentRoles.includes(needRole)) {
26
+ this.save(key, true);
27
+ return true;
28
+ }
29
+ const result = currentRoles.some((role) => this.hasRole(needRole, role));
30
+ this.save(key, result);
31
+ return result;
32
+ }
33
+ save(key, flag) {
34
+ this.cache.set(key, flag);
35
+ }
36
+ generateKey(current, needed) {
37
+ return `${current}:${needed}`;
38
+ }
39
+ }
40
+ //# sourceMappingURL=role-hierarchy.util.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role-hierarchy.util.js","sourceRoot":"","sources":["../../src/common/role-hierarchy.util.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,aAAa;IACP,GAAG,CAAwB;IAC3B,KAAK,CAAuB;IAE7C,YAAmB,GAA0B;QAC3C,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,CAChB,CAAC,GAAG,GAAG,CAAC,OAAO,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,cAAc,CAAC,EAAE,EAAE,CAAC;YACjD,IAAI;YACJ,CAAC,GAAG,cAAc,CAAC;SACpB,CAAC,CACH,CAAC;QACF,IAAI,CAAC,KAAK,GAAG,IAAI,GAAG,EAAmB,CAAC;IAC1C,CAAC;IAEM,OAAO,CAAC,QAAgB,EAAE,WAAmB;QAClD,MAAM,GAAG,GAAW,IAAI,CAAC,WAAW,CAAC,WAAW,EAAE,QAAQ,CAAC,CAAC;QAC5D,MAAM,SAAS,GAAwB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3D,IAAI,SAAS,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC9C,IAAI,QAAQ,KAAK,WAAW,EAAE,CAAC;YAC7B,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,YAAY,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,WAAW,CAAC,CAAC;QAC/C,IAAI,CAAC,YAAY,EAAE,CAAC;YAClB,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;YACtB,OAAO,KAAK,CAAC;QACf,CAAC;QACD,IAAI,YAAY,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YACpC,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;YACrB,OAAO,IAAI,CAAC;QACd,CAAC;QACD,MAAM,MAAM,GAAY,YAAY,CAAC,IAAI,CAAC,CAAC,IAAI,EAAE,EAAE,CACjD,IAAI,CAAC,OAAO,CAAC,QAAQ,EAAE,IAAI,CAAC,CAC7B,CAAC;QACF,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,CAAC;QACvB,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,IAAI,CAAC,GAAW,EAAE,IAAa;QACrC,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC,CAAC;IAC5B,CAAC;IAEO,WAAW,CAAC,OAAe,EAAE,MAAc;QACjD,OAAO,GAAG,OAAO,IAAI,MAAM,EAAE,CAAC;IAChC,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=role.hierarchy.util.spec.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role.hierarchy.util.spec.d.ts","sourceRoot":"","sources":["../../src/common/role.hierarchy.util.spec.ts"],"names":[],"mappings":""}
@@ -0,0 +1,36 @@
1
+ import { beforeAll, expect, it, describe } from "vitest";
2
+ import { RoleHierarchy } from "./role-hierarchy.util.js";
3
+ const USER = "USER";
4
+ const PRO = "PRO";
5
+ const ADMIN = "ADMIN";
6
+ describe("Role Hierarchy tests", () => {
7
+ let hierarchy;
8
+ beforeAll(() => {
9
+ hierarchy = new RoleHierarchy(new Map([
10
+ [USER, []],
11
+ [PRO, [USER]],
12
+ [ADMIN, [PRO]],
13
+ ]));
14
+ });
15
+ it(`returns false if needUser = ${ADMIN}, currentUser = ${PRO}`, () => {
16
+ const result = hierarchy.hasRole(ADMIN, PRO);
17
+ expect(result).toBeFalsy();
18
+ });
19
+ it(`returns false if needUser = ${ADMIN}, currentUser = ${USER}`, () => {
20
+ const result = hierarchy.hasRole(ADMIN, USER);
21
+ expect(result).toBeFalsy();
22
+ });
23
+ it(`returns false if needUser = ${ADMIN}, currentUser = ${ADMIN}`, () => {
24
+ const result = hierarchy.hasRole(ADMIN, ADMIN);
25
+ expect(result).toBeTruthy();
26
+ });
27
+ it("returns false if role not found", () => {
28
+ const result = hierarchy.hasRole(ADMIN, "TEST");
29
+ expect(result).toBeFalsy();
30
+ });
31
+ it(`returns false if needUser = ${PRO}, currentUser = ${ADMIN}`, () => {
32
+ const result = hierarchy.hasRole(PRO, ADMIN);
33
+ expect(result).toBeTruthy();
34
+ });
35
+ });
36
+ //# sourceMappingURL=role.hierarchy.util.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"role.hierarchy.util.spec.js","sourceRoot":"","sources":["../../src/common/role.hierarchy.util.spec.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,EAAE,EAAE,EAAE,QAAQ,EAAE,MAAM,QAAQ,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,0BAA0B,CAAC;AAEzD,MAAM,IAAI,GAAW,MAAM,CAAC;AAC5B,MAAM,GAAG,GAAW,KAAK,CAAC;AAC1B,MAAM,KAAK,GAAW,OAAO,CAAC;AAE9B,QAAQ,CAAC,sBAAsB,EAAE,GAAG,EAAE;IACpC,IAAI,SAAwB,CAAC;IAE7B,SAAS,CAAC,GAAG,EAAE;QACb,SAAS,GAAG,IAAI,aAAa,CAC3B,IAAI,GAAG,CAAmB;YACxB,CAAC,IAAI,EAAE,EAAE,CAAC;YACV,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,CAAC;YACb,CAAC,KAAK,EAAE,CAAC,GAAG,CAAC,CAAC;SACf,CAAC,CACH,CAAC;IACJ,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,KAAK,mBAAmB,GAAG,EAAE,EAAE,GAAG,EAAE;QACpE,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,GAAG,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,KAAK,mBAAmB,IAAI,EAAE,EAAE,GAAG,EAAE;QACrE,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;QAC9C,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,KAAK,mBAAmB,KAAK,EAAE,EAAE,GAAG,EAAE;QACtE,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,KAAK,CAAC,CAAC;QAC/C,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,iCAAiC,EAAE,GAAG,EAAE;QACzC,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,KAAK,EAAE,MAAM,CAAC,CAAC;QAChD,MAAM,CAAC,MAAM,CAAC,CAAC,SAAS,EAAE,CAAC;IAC7B,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,+BAA+B,GAAG,mBAAmB,KAAK,EAAE,EAAE,GAAG,EAAE;QACpE,MAAM,MAAM,GAAG,SAAS,CAAC,OAAO,CAAC,GAAG,EAAE,KAAK,CAAC,CAAC;QAC7C,MAAM,CAAC,MAAM,CAAC,CAAC,UAAU,EAAE,CAAC;IAC9B,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -1,7 +1,7 @@
1
1
  import z from "zod";
2
2
  export declare const NewUserSchema: z.ZodObject<{
3
- login: z.ZodNonOptional<z.ZodString>;
4
- password: z.ZodNonOptional<z.ZodString>;
3
+ login: z.ZodString;
4
+ password: z.ZodString;
5
5
  displayName: z.ZodOptional<z.ZodString>;
6
6
  }, z.core.$strip>;
7
7
  export type NewUserPayload = z.infer<typeof NewUserSchema>;
@@ -1 +1 @@
1
- {"version":3,"file":"new-user.schema.d.ts","sourceRoot":"","sources":["../../src/users/new-user.schema.ts"],"names":[],"mappings":"AACA,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,eAAO,MAAM,aAAa;;;;iBAwBM,CAAC;AACjC,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC"}
1
+ {"version":3,"file":"new-user.schema.d.ts","sourceRoot":"","sources":["../../src/users/new-user.schema.ts"],"names":[],"mappings":"AACA,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,eAAO,MAAM,aAAa;;;;iBA4B+C,CAAC;AAC1E,MAAM,MAAM,cAAc,GAAG,CAAC,CAAC,KAAK,CAAC,OAAO,aAAa,CAAC,CAAC"}
@@ -3,12 +3,14 @@ import z from "zod";
3
3
  export const NewUserSchema = z
4
4
  .object({
5
5
  login: z
6
- .string()
6
+ .string({ message: UserCodes.LOGIN.UNDEFINED })
7
7
  .nonempty({ message: UserCodes.LOGIN.EMPTY })
8
- .nonoptional({ message: UserCodes.LOGIN.UNDEFINED })
9
- .meta({ example: "andrey_sorokovsky" }),
8
+ .meta({
9
+ example: "andrey_sorokovsky",
10
+ description: "Унікальне ім'я користувача",
11
+ }),
10
12
  password: z
11
- .string()
13
+ .string({ message: UserCodes.PASSWORD.UNDEFINED })
12
14
  .min(UserCodes.PASSWORD.MIN_LENGTH.VALUE, {
13
15
  message: UserCodes.PASSWORD.MIN_LENGTH.CODE,
14
16
  })
@@ -16,13 +18,15 @@ export const NewUserSchema = z
16
18
  message: UserCodes.PASSWORD.MAX_LENGTH.CODE,
17
19
  })
18
20
  .nonempty({ message: UserCodes.PASSWORD.EMPTY })
19
- .nonoptional({ message: UserCodes.PASSWORD.UNDEFINED })
20
- .meta({ example: "<PASSWORD>" }),
21
+ .meta({ example: "<PASSWORD>", description: "Пароль користувача" }),
21
22
  displayName: z
22
- .string()
23
+ .string({ message: UserCodes.DISPLAY_NAME.EMPTY })
23
24
  .nonempty({ message: UserCodes.DISPLAY_NAME.EMPTY })
24
25
  .optional()
25
- .meta({ example: "Сороковський Андрій" }),
26
+ .meta({
27
+ example: "Сороковський Андрій",
28
+ description: "Видиме ім'я користувача",
29
+ }),
26
30
  })
27
- .meta({ id: "NewUserSchema" });
31
+ .meta({ id: "NewUserSchema", description: "Данні нового користувача" });
28
32
  //# sourceMappingURL=new-user.schema.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"new-user.schema.js","sourceRoot":"","sources":["../../src/users/new-user.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC;KAC3B,MAAM,CAAC;IACN,KAAK,EAAE,CAAC;SACL,MAAM,EAAE;SACR,QAAQ,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;SAC5C,WAAW,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;SACnD,IAAI,CAAC,EAAE,OAAO,EAAE,mBAAmB,EAAE,CAAC;IACzC,QAAQ,EAAE,CAAC;SACR,MAAM,EAAE;SACR,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE;QACxC,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI;KAC5C,CAAC;SACD,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE;QACxC,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI;KAC5C,CAAC;SACD,QAAQ,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;SAC/C,WAAW,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;SACtD,IAAI,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,CAAC;IAClC,WAAW,EAAE,CAAC;SACX,MAAM,EAAE;SACR,QAAQ,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;SACnD,QAAQ,EAAE;SACV,IAAI,CAAC,EAAE,OAAO,EAAE,qBAAqB,EAAE,CAAC;CAC5C,CAAC;KACD,IAAI,CAAC,EAAE,EAAE,EAAE,eAAe,EAAE,CAAC,CAAC"}
1
+ {"version":3,"file":"new-user.schema.js","sourceRoot":"","sources":["../../src/users/new-user.schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AACvC,OAAO,CAAC,MAAM,KAAK,CAAC;AAEpB,MAAM,CAAC,MAAM,aAAa,GAAG,CAAC;KAC3B,MAAM,CAAC;IACN,KAAK,EAAE,CAAC;SACL,MAAM,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,SAAS,EAAE,CAAC;SAC9C,QAAQ,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,KAAK,CAAC,KAAK,EAAE,CAAC;SAC5C,IAAI,CAAC;QACJ,OAAO,EAAE,mBAAmB;QAC5B,WAAW,EAAE,4BAA4B;KAC1C,CAAC;IACJ,QAAQ,EAAE,CAAC;SACR,MAAM,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC,SAAS,EAAE,CAAC;SACjD,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE;QACxC,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI;KAC5C,CAAC;SACD,GAAG,CAAC,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,KAAK,EAAE;QACxC,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC,UAAU,CAAC,IAAI;KAC5C,CAAC;SACD,QAAQ,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAC;SAC/C,IAAI,CAAC,EAAE,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,oBAAoB,EAAE,CAAC;IACrE,WAAW,EAAE,CAAC;SACX,MAAM,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;SACjD,QAAQ,CAAC,EAAE,OAAO,EAAE,SAAS,CAAC,YAAY,CAAC,KAAK,EAAE,CAAC;SACnD,QAAQ,EAAE;SACV,IAAI,CAAC;QACJ,OAAO,EAAE,qBAAqB;QAC9B,WAAW,EAAE,yBAAyB;KACvC,CAAC;CACL,CAAC;KACD,IAAI,CAAC,EAAE,EAAE,EAAE,eAAe,EAAE,WAAW,EAAE,0BAA0B,EAAE,CAAC,CAAC"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sorokchat-messenger/contracts",
3
- "version": "1.0.6",
3
+ "version": "1.0.8",
4
4
  "description": "Frontend and backend contracts",
5
5
  "keywords": [
6
6
  "frontend",
@@ -34,14 +34,18 @@
34
34
  }
35
35
  },
36
36
  "scripts": {
37
- "build": "tsc"
37
+ "build": "tsc",
38
+ "test": "vitest run",
39
+ "test:cov": "vitest run --coverage"
38
40
  },
39
41
  "devDependencies": {
40
42
  "@sorokchat-messenger/core": "^1.0.0",
41
43
  "prettier": "^3.9.6"
42
44
  },
43
45
  "dependencies": {
46
+ "@vitest/coverage-v8": "^5.0.1",
44
47
  "reflect-metadata": "^0.2.2",
48
+ "vitest": "^5.0.1",
45
49
  "zod": "^4.5.4"
46
50
  }
47
51
  }