@greatapps/common 1.1.447 → 1.1.448

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.
@@ -1,5 +1,5 @@
1
1
  import "server-only";
2
- import { api } from "@greatapps/common/server";
2
+ import { api, getUserContext } from "@greatapps/common/server";
3
3
  import { ApiError, buildQueryParams, PlanSchema } from "@greatapps/common";
4
4
  import greatCache from "@greatapps/cache";
5
5
  const PLANS_CACHE_TTL = 604800;
@@ -22,7 +22,11 @@ class PlansService {
22
22
  * GET /{id_wl}/plans?active=true&search=client&sort=id:ASC
23
23
  */
24
24
  async listPlans(params) {
25
- const cacheKey = this.buildCacheKey("plans", params);
25
+ const { id_account } = await getUserContext();
26
+ const cacheKey = this.buildCacheKey("plans", {
27
+ ...params,
28
+ id_account
29
+ });
26
30
  const cachedData = await this.cache.select(cacheKey);
27
31
  if (cachedData.status == 1 && "data" in cachedData && cachedData.data) {
28
32
  const data2 = JSON.parse(cachedData.data);
@@ -32,7 +36,7 @@ class PlansService {
32
36
  sort: params?.sort ?? "id:ASC",
33
37
  active: params?.active,
34
38
  search: params?.search,
35
- id_account: params?.id_account
39
+ id_account
36
40
  });
37
41
  const url = `/plans${query ? `?${query}` : ""}`;
38
42
  const response = await api.apps.get(url);
@@ -52,15 +56,19 @@ class PlansService {
52
56
  success: true
53
57
  };
54
58
  }
55
- async findById(idPlan, id_account) {
56
- const cacheKey = this.buildCacheKey(`plan-${idPlan}-${id_account}`);
59
+ async findById(idPlan) {
60
+ const { id_account } = await getUserContext();
61
+ const cacheKey = this.buildCacheKey(`plan-${idPlan}`, {
62
+ id_account: String(id_account)
63
+ });
57
64
  const cachedData = await this.cache.select(cacheKey);
58
65
  if (cachedData.status == 1 && "data" in cachedData && cachedData.data) {
59
66
  const data = JSON.parse(cachedData.data);
60
67
  return { data, success: true };
61
68
  }
69
+ const query = buildQueryParams({ type: "client", id_account });
62
70
  const response = await api.apps.get(
63
- `/plans/${idPlan}?type=client&id_account=${id_account}`
71
+ `/plans/${idPlan}?${query}`
64
72
  );
65
73
  if (response.status === 0) {
66
74
  throw new ApiError(
@@ -70,11 +78,7 @@ class PlansService {
70
78
  );
71
79
  }
72
80
  if (!response.data?.length) {
73
- throw new ApiError(
74
- "Plano n\xE3o encontrado",
75
- "PLAN_NOT_FOUND",
76
- 404
77
- );
81
+ throw new ApiError("Plano n\xE3o encontrado", "PLAN_NOT_FOUND", 404);
78
82
  }
79
83
  const plan = PlanSchema.parse(response.data[0]);
80
84
  await this.cache.insert(cacheKey, JSON.stringify(plan), PLANS_CACHE_TTL);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../src/modules/plans/services/plans.service.ts"],"sourcesContent":["import 'server-only';\n\nimport { api, apiClient } from '@greatapps/common/server';\nimport { ApiError, buildQueryParams, PlanSchema } from '@greatapps/common';\nimport type { ApiPaginatedActionResult, PaginatedSuccessResult, Plan, SuccessResult } from '@greatapps/common';\nimport greatCache from '@greatapps/cache';\n\nexport type ListPlansParams = {\n sort?: string;\n active?: boolean;\n search?: string;\n id_account?: string;\n};\n\nconst PLANS_CACHE_TTL = 604800;\n\nclass PlansService {\n private cache = new greatCache({\n service: 'plans',\n version: '1.0.2',\n domain: 'whitelabel-cache.greatapps.com.br',\n ambient: process.env.NODE_ENV || 'development',\n });\n\n private buildCacheKey(key: string, params?: ListPlansParams): string {\n const sort = params?.sort ?? 'id:ASC';\n const active = params?.active ?? '';\n const search = params?.search ?? '';\n return `${key}-${sort}-${active}-${search}-v2`;\n }\n\n /**\n * Lista planos do whitelabel.\n * Exemplo:\n * GET /{id_wl}/plans?active=true&search=client&sort=id:ASC\n */\n async listPlans(params?: ListPlansParams): Promise<PaginatedSuccessResult<Plan>> {\n const cacheKey = this.buildCacheKey('plans', params);\n\n const cachedData = await this.cache.select(cacheKey);\n\n if (cachedData.status == 1 && 'data' in cachedData && cachedData.data) {\n const data = JSON.parse(cachedData.data) as Plan[];\n return { data, total: data.length, success: true };\n }\n\n const query = buildQueryParams({\n sort: params?.sort ?? 'id:ASC',\n active: params?.active,\n search: params?.search,\n id_account: params?.id_account\n });\n const url = `/plans${query ? `?${query}` : ''}`;\n\n const response = await api.apps.get<ApiPaginatedActionResult<Plan[]>>(url);\n\n if (response.status === 0) {\n throw new ApiError(\n (response as { message?: string }).message || 'Erro ao listar planos',\n 'LIST_PLANS_FAILED',\n 400\n );\n }\n\n const rawData = (response as { data?: unknown }).data;\n const data = Array.isArray(rawData)\n ? rawData.map((item) => PlanSchema.parse(item))\n : [];\n\n await this.cache.insert(cacheKey, JSON.stringify(data), PLANS_CACHE_TTL);\n\n return {\n data,\n total: response.total,\n success: true,\n } satisfies PaginatedSuccessResult<Plan>;\n }\n\n\n async findById(idPlan: number | string, id_account: string): Promise<SuccessResult<Plan>> {\n const cacheKey = this.buildCacheKey(`plan-${idPlan}-${id_account}`);\n\n const cachedData = await this.cache.select(cacheKey);\n \n if (cachedData.status == 1 && 'data' in cachedData && cachedData.data) {\n const data = JSON.parse(cachedData.data) as Plan;\n return { data, success: true };\n }\n\n const response = await api.apps.get<ApiPaginatedActionResult<Plan>>(\n `/plans/${idPlan}?type=client&id_account=${id_account}`\n );\n\n if (response.status === 0) {\n throw new ApiError(\n response.message || 'Erro ao buscar plano',\n 'FIND_PLAN_FAILED',\n 400\n );\n }\n\n if (!response.data?.length) {\n throw new ApiError(\n 'Plano não encontrado',\n 'PLAN_NOT_FOUND',\n 404\n );\n }\n\n const plan = PlanSchema.parse(response.data[0]);\n\n await this.cache.insert(cacheKey, JSON.stringify(plan), PLANS_CACHE_TTL);\n\n return {\n success: true,\n data: plan,\n };\n }\n}\n\nexport const plansService = new PlansService();\n"],"mappings":"AAAA,OAAO;AAEP,SAAS,WAAsB;AAC/B,SAAS,UAAU,kBAAkB,kBAAkB;AAEvD,OAAO,gBAAgB;AASvB,MAAM,kBAAkB;AAExB,MAAM,aAAa;AAAA,EACT,QAAQ,IAAI,WAAW;AAAA,IAC7B,SAAS;AAAA,IACT,SAAS;AAAA,IACT,QAAQ;AAAA,IACR,SAAS,QAAQ,IAAI,YAAY;AAAA,EACnC,CAAC;AAAA,EAEO,cAAc,KAAa,QAAkC;AACnE,UAAM,OAAO,QAAQ,QAAQ;AAC7B,UAAM,SAAS,QAAQ,UAAU;AACjC,UAAM,SAAS,QAAQ,UAAU;AACjC,WAAO,GAAG,GAAG,IAAI,IAAI,IAAI,MAAM,IAAI,MAAM;AAAA,EAC3C;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,UAAU,QAAiE;AAC/E,UAAM,WAAW,KAAK,cAAc,SAAS,MAAM;AAEnD,UAAM,aAAa,MAAM,KAAK,MAAM,OAAO,QAAQ;AAEnD,QAAI,WAAW,UAAU,KAAK,UAAU,cAAc,WAAW,MAAM;AACrE,YAAMA,QAAO,KAAK,MAAM,WAAW,IAAI;AACvC,aAAO,EAAE,MAAAA,OAAM,OAAOA,MAAK,QAAQ,SAAS,KAAK;AAAA,IACnD;AAEA,UAAM,QAAQ,iBAAiB;AAAA,MAC7B,MAAM,QAAQ,QAAQ;AAAA,MACtB,QAAQ,QAAQ;AAAA,MAChB,QAAQ,QAAQ;AAAA,MAChB,YAAY,QAAQ;AAAA,IACtB,CAAC;AACD,UAAM,MAAM,SAAS,QAAQ,IAAI,KAAK,KAAK,EAAE;AAE7C,UAAM,WAAW,MAAM,IAAI,KAAK,IAAsC,GAAG;AAEzE,QAAI,SAAS,WAAW,GAAG;AACzB,YAAM,IAAI;AAAA,QACP,SAAkC,WAAW;AAAA,QAC9C;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,UAAW,SAAgC;AACjD,UAAM,OAAO,MAAM,QAAQ,OAAO,IAC9B,QAAQ,IAAI,CAAC,SAAS,WAAW,MAAM,IAAI,CAAC,IAC5C,CAAC;AAEL,UAAM,KAAK,MAAM,OAAO,UAAU,KAAK,UAAU,IAAI,GAAG,eAAe;AAEvE,WAAO;AAAA,MACL;AAAA,MACA,OAAO,SAAS;AAAA,MAChB,SAAS;AAAA,IACX;AAAA,EACF;AAAA,EAGA,MAAM,SAAS,QAAyB,YAAkD;AACxF,UAAM,WAAW,KAAK,cAAc,QAAQ,MAAM,IAAI,UAAU,EAAE;AAElE,UAAM,aAAa,MAAM,KAAK,MAAM,OAAO,QAAQ;AAEnD,QAAI,WAAW,UAAU,KAAK,UAAU,cAAc,WAAW,MAAM;AACrE,YAAM,OAAO,KAAK,MAAM,WAAW,IAAI;AACvC,aAAO,EAAE,MAAM,SAAS,KAAK;AAAA,IAC/B;AAEA,UAAM,WAAW,MAAM,IAAI,KAAK;AAAA,MAC9B,UAAU,MAAM,2BAA2B,UAAU;AAAA,IACvD;AAEA,QAAI,SAAS,WAAW,GAAG;AACzB,YAAM,IAAI;AAAA,QACR,SAAS,WAAW;AAAA,QACpB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,SAAS,MAAM,QAAQ;AAC1B,YAAM,IAAI;AAAA,QACR;AAAA,QACA;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,UAAM,OAAO,WAAW,MAAM,SAAS,KAAK,CAAC,CAAC;AAE9C,UAAM,KAAK,MAAM,OAAO,UAAU,KAAK,UAAU,IAAI,GAAG,eAAe;AAEvE,WAAO;AAAA,MACL,SAAS;AAAA,MACT,MAAM;AAAA,IACR;AAAA,EACF;AACF;AAEO,MAAM,eAAe,IAAI,aAAa;","names":["data"]}
1
+ {"version":3,"sources":["../../../../src/modules/plans/services/plans.service.ts"],"sourcesContent":["import \"server-only\";\n\nimport { api, apiClient, getUserContext } from \"@greatapps/common/server\";\nimport { ApiError, buildQueryParams, PlanSchema } from \"@greatapps/common\";\nimport type {\n ApiPaginatedActionResult,\n PaginatedSuccessResult,\n Plan,\n SuccessResult,\n} from \"@greatapps/common\";\nimport greatCache from \"@greatapps/cache\";\n\nexport type ListPlansParams = {\n sort?: string;\n active?: boolean;\n search?: string;\n};\n\nconst PLANS_CACHE_TTL = 604800;\n\nclass PlansService {\n private cache = new greatCache({\n service: \"plans\",\n version: \"1.0.2\",\n domain: \"whitelabel-cache.greatapps.com.br\",\n ambient: process.env.NODE_ENV || \"development\",\n });\n\n private buildCacheKey(key: string, params?: Record<string, unknown>): string {\n const sort = params?.sort ?? \"id:ASC\";\n const active = params?.active ?? \"\";\n const search = params?.search ?? \"\";\n return `${key}-${sort}-${active}-${search}-v2`;\n }\n\n /**\n * Lista planos do whitelabel.\n * Exemplo:\n * GET /{id_wl}/plans?active=true&search=client&sort=id:ASC\n */\n async listPlans(\n params?: ListPlansParams,\n ): Promise<PaginatedSuccessResult<Plan>> {\n const { id_account } = await getUserContext();\n const cacheKey = this.buildCacheKey(\"plans\", {\n ...params,\n id_account,\n });\n\n const cachedData = await this.cache.select(cacheKey);\n\n if (cachedData.status == 1 && \"data\" in cachedData && cachedData.data) {\n const data = JSON.parse(cachedData.data) as Plan[];\n return { data, total: data.length, success: true };\n }\n\n const query = buildQueryParams({\n sort: params?.sort ?? \"id:ASC\",\n active: params?.active,\n search: params?.search,\n id_account: id_account,\n });\n const url = `/plans${query ? `?${query}` : \"\"}`;\n\n const response = await api.apps.get<ApiPaginatedActionResult<Plan[]>>(url);\n\n if (response.status === 0) {\n throw new ApiError(\n (response as { message?: string }).message || \"Erro ao listar planos\",\n \"LIST_PLANS_FAILED\",\n 400,\n );\n }\n\n const rawData = (response as { data?: unknown }).data;\n const data = Array.isArray(rawData)\n ? rawData.map((item) => PlanSchema.parse(item))\n : [];\n\n await this.cache.insert(cacheKey, JSON.stringify(data), PLANS_CACHE_TTL);\n\n return {\n data,\n total: response.total,\n success: true,\n } satisfies PaginatedSuccessResult<Plan>;\n }\n\n async findById(idPlan: number | string): Promise<SuccessResult<Plan>> {\n const { id_account } = await getUserContext();\n const cacheKey = this.buildCacheKey(`plan-${idPlan}`, {\n id_account: String(id_account),\n });\n\n const cachedData = await this.cache.select(cacheKey);\n\n if (cachedData.status == 1 && \"data\" in cachedData && cachedData.data) {\n const data = JSON.parse(cachedData.data) as Plan;\n return { data, success: true };\n }\n\n const query = buildQueryParams({ type: \"client\", id_account });\n\n const response = await api.apps.get<ApiPaginatedActionResult<Plan>>(\n `/plans/${idPlan}?${query}`,\n );\n\n if (response.status === 0) {\n throw new ApiError(\n response.message || \"Erro ao buscar plano\",\n \"FIND_PLAN_FAILED\",\n 400,\n );\n }\n\n if (!response.data?.length) {\n throw new ApiError(\"Plano não encontrado\", \"PLAN_NOT_FOUND\", 404);\n }\n\n const plan = PlanSchema.parse(response.data[0]);\n\n await this.cache.insert(cacheKey, JSON.stringify(plan), PLANS_CACHE_TTL);\n\n return {\n success: true,\n data: plan,\n };\n }\n}\n\nexport const plansService = new PlansService();\n"],"mappings":"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","names":["data"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@greatapps/common",
3
- "version": "1.1.447",
3
+ "version": "1.1.448",
4
4
  "description": "Shared library for GreatApps frontend applications",
5
5
  "main": "./dist/index.mjs",
6
6
  "types": "./src/index.ts",
@@ -1,31 +1,35 @@
1
- import 'server-only';
2
-
3
- import { api, apiClient } from '@greatapps/common/server';
4
- import { ApiError, buildQueryParams, PlanSchema } from '@greatapps/common';
5
- import type { ApiPaginatedActionResult, PaginatedSuccessResult, Plan, SuccessResult } from '@greatapps/common';
6
- import greatCache from '@greatapps/cache';
1
+ import "server-only";
2
+
3
+ import { api, apiClient, getUserContext } from "@greatapps/common/server";
4
+ import { ApiError, buildQueryParams, PlanSchema } from "@greatapps/common";
5
+ import type {
6
+ ApiPaginatedActionResult,
7
+ PaginatedSuccessResult,
8
+ Plan,
9
+ SuccessResult,
10
+ } from "@greatapps/common";
11
+ import greatCache from "@greatapps/cache";
7
12
 
8
13
  export type ListPlansParams = {
9
14
  sort?: string;
10
15
  active?: boolean;
11
16
  search?: string;
12
- id_account?: string;
13
17
  };
14
18
 
15
19
  const PLANS_CACHE_TTL = 604800;
16
20
 
17
21
  class PlansService {
18
22
  private cache = new greatCache({
19
- service: 'plans',
20
- version: '1.0.2',
21
- domain: 'whitelabel-cache.greatapps.com.br',
22
- ambient: process.env.NODE_ENV || 'development',
23
+ service: "plans",
24
+ version: "1.0.2",
25
+ domain: "whitelabel-cache.greatapps.com.br",
26
+ ambient: process.env.NODE_ENV || "development",
23
27
  });
24
28
 
25
- private buildCacheKey(key: string, params?: ListPlansParams): string {
26
- const sort = params?.sort ?? 'id:ASC';
27
- const active = params?.active ?? '';
28
- const search = params?.search ?? '';
29
+ private buildCacheKey(key: string, params?: Record<string, unknown>): string {
30
+ const sort = params?.sort ?? "id:ASC";
31
+ const active = params?.active ?? "";
32
+ const search = params?.search ?? "";
29
33
  return `${key}-${sort}-${active}-${search}-v2`;
30
34
  }
31
35
 
@@ -34,31 +38,37 @@ class PlansService {
34
38
  * Exemplo:
35
39
  * GET /{id_wl}/plans?active=true&search=client&sort=id:ASC
36
40
  */
37
- async listPlans(params?: ListPlansParams): Promise<PaginatedSuccessResult<Plan>> {
38
- const cacheKey = this.buildCacheKey('plans', params);
41
+ async listPlans(
42
+ params?: ListPlansParams,
43
+ ): Promise<PaginatedSuccessResult<Plan>> {
44
+ const { id_account } = await getUserContext();
45
+ const cacheKey = this.buildCacheKey("plans", {
46
+ ...params,
47
+ id_account,
48
+ });
39
49
 
40
50
  const cachedData = await this.cache.select(cacheKey);
41
51
 
42
- if (cachedData.status == 1 && 'data' in cachedData && cachedData.data) {
52
+ if (cachedData.status == 1 && "data" in cachedData && cachedData.data) {
43
53
  const data = JSON.parse(cachedData.data) as Plan[];
44
54
  return { data, total: data.length, success: true };
45
55
  }
46
56
 
47
57
  const query = buildQueryParams({
48
- sort: params?.sort ?? 'id:ASC',
58
+ sort: params?.sort ?? "id:ASC",
49
59
  active: params?.active,
50
60
  search: params?.search,
51
- id_account: params?.id_account
61
+ id_account: id_account,
52
62
  });
53
- const url = `/plans${query ? `?${query}` : ''}`;
63
+ const url = `/plans${query ? `?${query}` : ""}`;
54
64
 
55
65
  const response = await api.apps.get<ApiPaginatedActionResult<Plan[]>>(url);
56
66
 
57
67
  if (response.status === 0) {
58
68
  throw new ApiError(
59
- (response as { message?: string }).message || 'Erro ao listar planos',
60
- 'LIST_PLANS_FAILED',
61
- 400
69
+ (response as { message?: string }).message || "Erro ao listar planos",
70
+ "LIST_PLANS_FAILED",
71
+ 400,
62
72
  );
63
73
  }
64
74
 
@@ -76,35 +86,35 @@ class PlansService {
76
86
  } satisfies PaginatedSuccessResult<Plan>;
77
87
  }
78
88
 
79
-
80
- async findById(idPlan: number | string, id_account: string): Promise<SuccessResult<Plan>> {
81
- const cacheKey = this.buildCacheKey(`plan-${idPlan}-${id_account}`);
89
+ async findById(idPlan: number | string): Promise<SuccessResult<Plan>> {
90
+ const { id_account } = await getUserContext();
91
+ const cacheKey = this.buildCacheKey(`plan-${idPlan}`, {
92
+ id_account: String(id_account),
93
+ });
82
94
 
83
95
  const cachedData = await this.cache.select(cacheKey);
84
-
85
- if (cachedData.status == 1 && 'data' in cachedData && cachedData.data) {
96
+
97
+ if (cachedData.status == 1 && "data" in cachedData && cachedData.data) {
86
98
  const data = JSON.parse(cachedData.data) as Plan;
87
99
  return { data, success: true };
88
100
  }
89
101
 
102
+ const query = buildQueryParams({ type: "client", id_account });
103
+
90
104
  const response = await api.apps.get<ApiPaginatedActionResult<Plan>>(
91
- `/plans/${idPlan}?type=client&id_account=${id_account}`
105
+ `/plans/${idPlan}?${query}`,
92
106
  );
93
107
 
94
108
  if (response.status === 0) {
95
109
  throw new ApiError(
96
- response.message || 'Erro ao buscar plano',
97
- 'FIND_PLAN_FAILED',
98
- 400
110
+ response.message || "Erro ao buscar plano",
111
+ "FIND_PLAN_FAILED",
112
+ 400,
99
113
  );
100
114
  }
101
115
 
102
116
  if (!response.data?.length) {
103
- throw new ApiError(
104
- 'Plano não encontrado',
105
- 'PLAN_NOT_FOUND',
106
- 404
107
- );
117
+ throw new ApiError("Plano não encontrado", "PLAN_NOT_FOUND", 404);
108
118
  }
109
119
 
110
120
  const plan = PlanSchema.parse(response.data[0]);