@greatapps/common 1.1.661 → 1.1.663
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/dist/infra/route/parse-numeric.mjs +17 -0
- package/dist/infra/route/parse-numeric.mjs.map +1 -0
- package/dist/modules/auth/actions/verify-two-factor.action.mjs +2 -2
- package/dist/modules/auth/actions/verify-two-factor.action.mjs.map +1 -1
- package/dist/modules/auth/hooks/useUserQuery.mjs +7 -2
- package/dist/modules/auth/hooks/useUserQuery.mjs.map +1 -1
- package/dist/modules/auth/services/auth.service.mjs +7 -1
- package/dist/modules/auth/services/auth.service.mjs.map +1 -1
- package/dist/modules/projects/handlers/list-all-account-users.handler.mjs +6 -1
- package/dist/modules/projects/handlers/list-all-account-users.handler.mjs.map +1 -1
- package/dist/modules/projects/handlers/list-available-users.handler.mjs +6 -1
- package/dist/modules/projects/handlers/list-available-users.handler.mjs.map +1 -1
- package/dist/modules/projects/handlers/list-project-users.handler.mjs +6 -1
- package/dist/modules/projects/handlers/list-project-users.handler.mjs.map +1 -1
- package/dist/modules/projects/handlers/list-projects.handler.mjs +6 -1
- package/dist/modules/projects/handlers/list-projects.handler.mjs.map +1 -1
- package/dist/modules/users/hooks/messages.hook.mjs.map +1 -1
- package/dist/modules/users/schema/messages.schema.mjs.map +1 -1
- package/dist/route.mjs +2 -0
- package/dist/route.mjs.map +1 -1
- package/dist/server.mjs +0 -16
- package/dist/server.mjs.map +1 -1
- package/package.json +2 -2
- package/src/infra/route/parse-numeric.ts +16 -0
- package/src/modules/auth/actions/verify-two-factor.action.ts +19 -15
- package/src/modules/auth/hooks/useUserQuery.ts +18 -2
- package/src/modules/auth/schema.ts +16 -0
- package/src/modules/auth/services/auth.service.ts +30 -2
- package/src/modules/projects/handlers/list-all-account-users.handler.ts +7 -1
- package/src/modules/projects/handlers/list-available-users.handler.ts +7 -1
- package/src/modules/projects/handlers/list-project-users.handler.ts +7 -1
- package/src/modules/projects/handlers/list-projects.handler.ts +7 -1
- package/src/modules/users/hooks/messages.hook.ts +3 -3
- package/src/modules/users/schema/messages.schema.ts +2 -0
- package/src/route.ts +1 -0
- package/dist/modules/cards/actions/find-card-by-id.action.mjs +0 -10
- package/dist/modules/cards/actions/find-card-by-id.action.mjs.map +0 -1
- package/dist/modules/cards/actions/list-cards.action.mjs +0 -10
- package/dist/modules/cards/actions/list-cards.action.mjs.map +0 -1
- package/dist/modules/charges/actions/find-charge-by-id.action.mjs +0 -10
- package/dist/modules/charges/actions/find-charge-by-id.action.mjs.map +0 -1
- package/dist/modules/charges/actions/list-charges.action.mjs +0 -10
- package/dist/modules/charges/actions/list-charges.action.mjs.map +0 -1
- package/dist/modules/ia-credits/actions/list-ia-credits.action.mjs +0 -10
- package/dist/modules/ia-credits/actions/list-ia-credits.action.mjs.map +0 -1
- package/dist/modules/pages/actions/count-pages.action.mjs +0 -12
- package/dist/modules/pages/actions/count-pages.action.mjs.map +0 -1
- package/dist/modules/plans/actions/find-plan-by-id.action.mjs +0 -10
- package/dist/modules/plans/actions/find-plan-by-id.action.mjs.map +0 -1
- package/dist/modules/plans/actions/list-plans.action.mjs +0 -17
- package/dist/modules/plans/actions/list-plans.action.mjs.map +0 -1
- package/dist/modules/projects/actions/list-all-account-users.action.mjs +0 -10
- package/dist/modules/projects/actions/list-all-account-users.action.mjs.map +0 -1
- package/dist/modules/projects/actions/list-available-users.action.mjs +0 -10
- package/dist/modules/projects/actions/list-available-users.action.mjs.map +0 -1
- package/dist/modules/users/action/list-messages.action.mjs +0 -25
- package/dist/modules/users/action/list-messages.action.mjs.map +0 -1
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
function parseNumericFields(params, fields) {
|
|
2
|
+
const result = { ...params };
|
|
3
|
+
for (const field of fields) {
|
|
4
|
+
const v = result[field];
|
|
5
|
+
if (typeof v === "string" && v !== "") {
|
|
6
|
+
const n = Number(v);
|
|
7
|
+
if (Number.isFinite(n)) {
|
|
8
|
+
result[field] = n;
|
|
9
|
+
}
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
return result;
|
|
13
|
+
}
|
|
14
|
+
export {
|
|
15
|
+
parseNumericFields
|
|
16
|
+
};
|
|
17
|
+
//# sourceMappingURL=parse-numeric.mjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/infra/route/parse-numeric.ts"],"sourcesContent":["export function parseNumericFields<T extends object>(\n params: Partial<T>,\n fields: readonly (keyof T)[]\n): Partial<T> {\n const result: Partial<T> = { ...params };\n for (const field of fields) {\n const v = result[field] as unknown;\n if (typeof v === 'string' && v !== '') {\n const n = Number(v);\n if (Number.isFinite(n)) {\n result[field] = n as T[keyof T];\n }\n }\n }\n return result;\n}\n"],"mappings":"AAAO,SAAS,mBACd,QACA,QACY;AACZ,QAAM,SAAqB,EAAE,GAAG,OAAO;AACvC,aAAW,SAAS,QAAQ;AAC1B,UAAM,IAAI,OAAO,KAAK;AACtB,QAAI,OAAO,MAAM,YAAY,MAAM,IAAI;AACrC,YAAM,IAAI,OAAO,CAAC;AAClB,UAAI,OAAO,SAAS,CAAC,GAAG;AACtB,eAAO,KAAK,IAAI;AAAA,MAClB;AAAA,IACF;AAAA,EACF;AACA,SAAO;AACT;","names":[]}
|
|
@@ -2,13 +2,13 @@
|
|
|
2
2
|
import { safeServerAction } from "../../../utils/safeServerAction";
|
|
3
3
|
import { authService } from "../services/auth.service";
|
|
4
4
|
import { getClientInfoFromRequest } from "../../../infra/utils/client-info";
|
|
5
|
-
async function verifyTwoFactorAction(cookie, code,
|
|
5
|
+
async function verifyTwoFactorAction(cookie, code, options) {
|
|
6
6
|
return safeServerAction(async () => {
|
|
7
7
|
if (!/^\d{6}$/.test(code)) {
|
|
8
8
|
throw new Error("Formato inv\xE1lido");
|
|
9
9
|
}
|
|
10
10
|
const clientInfo = await getClientInfoFromRequest();
|
|
11
|
-
|
|
11
|
+
return authService.verifyTwoFactor(cookie, code, clientInfo, options);
|
|
12
12
|
});
|
|
13
13
|
}
|
|
14
14
|
export {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/auth/actions/verify-two-factor.action.ts"],"sourcesContent":["'use server';\
|
|
1
|
+
{"version":3,"sources":["../../../../src/modules/auth/actions/verify-two-factor.action.ts"],"sourcesContent":["'use server';\n\nimport { safeServerAction } from '../../../utils/safeServerAction';\nimport { authService } from '../services/auth.service';\nimport { getClientInfoFromRequest } from '../../../infra/utils/client-info';\n\nexport async function verifyTwoFactorAction(\n cookie: string,\n code: string,\n options?: { window?: number; setCookie?: boolean },\n) {\n return safeServerAction(async () => {\n if (!/^\\d{6}$/.test(code)) {\n throw new Error('Formato inválido');\n }\n const clientInfo = await getClientInfoFromRequest();\n return authService.verifyTwoFactor(cookie, code, clientInfo, options);\n });\n}\n"],"mappings":";AAEA,SAAS,wBAAwB;AACjC,SAAS,mBAAmB;AAC5B,SAAS,gCAAgC;AAEzC,eAAsB,sBACpB,QACA,MACA,SACA;AACA,SAAO,iBAAiB,YAAY;AAClC,QAAI,CAAC,UAAU,KAAK,IAAI,GAAG;AACzB,YAAM,IAAI,MAAM,qBAAkB;AAAA,IACpC;AACA,UAAM,aAAa,MAAM,yBAAyB;AAClD,WAAO,YAAY,gBAAgB,QAAQ,MAAM,YAAY,OAAO;AAAA,EACtE,CAAC;AACH;","names":[]}
|
|
@@ -40,9 +40,14 @@ function useTwoFactorVerify() {
|
|
|
40
40
|
const userKey = useWlQueryKey([...USER_QUERY_KEY]);
|
|
41
41
|
const twoFactorKey = useWlQueryKey(["two-factor-pending"]);
|
|
42
42
|
return useMutation({
|
|
43
|
-
mutationFn: async ({
|
|
43
|
+
mutationFn: async ({
|
|
44
|
+
cookie,
|
|
45
|
+
code,
|
|
46
|
+
window,
|
|
47
|
+
setCookie
|
|
48
|
+
}) => {
|
|
44
49
|
const { verifyTwoFactorAction } = await import("../actions/verify-two-factor.action");
|
|
45
|
-
return withAction(() => verifyTwoFactorAction(cookie, code, window))();
|
|
50
|
+
return withAction(() => verifyTwoFactorAction(cookie, code, { window, setCookie }))();
|
|
46
51
|
},
|
|
47
52
|
onSuccess: () => {
|
|
48
53
|
queryClient.invalidateQueries({ queryKey: userKey });
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/auth/hooks/useUserQuery.ts"],"sourcesContent":["'use client';\n\nimport { useMutation, useQuery, useQueryClient, UseQueryOptions } from '@tanstack/react-query';\nimport { User } from '../../users/schema';\nimport { withAction } from '../../../utils/withAction';\nimport { useWlQueryKey } from '../../../hooks/useAuthQueryKey';\n\nexport const USER_QUERY_KEY = ['user'] as const;\nexport const USER_VALIDATE_SESSION_KEY = ['user-validate-session'] as const;\n\nasync function fetchUser(): Promise<User | null> {\n const { findUserById: getUserDataAction } = await import('../../users/action/find-user-by-id.action');\n const result = await getUserDataAction();\n return result.success && result.data ? result.data : null;\n}\n\nasync function validateUserSession(): Promise<boolean> {\n const { validateSessionAction } = await import('../actions/validate-session.action');\n return await validateSessionAction();\n}\n\nexport function useUserQuery() {\n const queryKey = useWlQueryKey([...USER_QUERY_KEY]);\n\n return useQuery({\n queryKey,\n queryFn: fetchUser,\n staleTime: 60 * 1000,\n gcTime: 10 * 60 * 1000,\n retry: false,\n });\n}\n\nexport function useUserValidateSession(options?: UseQueryOptions) {\n const queryKey = useWlQueryKey([...USER_VALIDATE_SESSION_KEY]);\n\n return useQuery({\n queryKey,\n queryFn: validateUserSession,\n retry: false,\n staleTime: 5 * 60 * 1000,\n ...options,\n refetchOnMount: 'always',\n refetchOnWindowFocus: true,\n });\n}\n\nexport function useTwoFactorVerify() {\n const queryClient = useQueryClient();\n const userKey = useWlQueryKey([...USER_QUERY_KEY]);\n const twoFactorKey = useWlQueryKey(['two-factor-pending']);\n\n return useMutation({\n mutationFn: async ({
|
|
1
|
+
{"version":3,"sources":["../../../../src/modules/auth/hooks/useUserQuery.ts"],"sourcesContent":["'use client';\n\nimport { useMutation, useQuery, useQueryClient, UseQueryOptions } from '@tanstack/react-query';\nimport { User } from '../../users/schema';\nimport { withAction } from '../../../utils/withAction';\nimport { useWlQueryKey } from '../../../hooks/useAuthQueryKey';\n\nexport const USER_QUERY_KEY = ['user'] as const;\nexport const USER_VALIDATE_SESSION_KEY = ['user-validate-session'] as const;\n\nasync function fetchUser(): Promise<User | null> {\n const { findUserById: getUserDataAction } = await import('../../users/action/find-user-by-id.action');\n const result = await getUserDataAction();\n return result.success && result.data ? result.data : null;\n}\n\nasync function validateUserSession(): Promise<boolean> {\n const { validateSessionAction } = await import('../actions/validate-session.action');\n return await validateSessionAction();\n}\n\nexport function useUserQuery() {\n const queryKey = useWlQueryKey([...USER_QUERY_KEY]);\n\n return useQuery({\n queryKey,\n queryFn: fetchUser,\n staleTime: 60 * 1000,\n gcTime: 10 * 60 * 1000,\n retry: false,\n });\n}\n\nexport function useUserValidateSession(options?: UseQueryOptions) {\n const queryKey = useWlQueryKey([...USER_VALIDATE_SESSION_KEY]);\n\n return useQuery({\n queryKey,\n queryFn: validateUserSession,\n retry: false,\n staleTime: 5 * 60 * 1000,\n ...options,\n refetchOnMount: 'always',\n refetchOnWindowFocus: true,\n });\n}\n\nexport function useTwoFactorVerify() {\n const queryClient = useQueryClient();\n const userKey = useWlQueryKey([...USER_QUERY_KEY]);\n const twoFactorKey = useWlQueryKey(['two-factor-pending']);\n\n return useMutation({\n mutationFn: async ({\n cookie,\n code,\n window,\n setCookie,\n }: {\n cookie: string;\n code: string;\n window?: number;\n /**\n * Quando `false`, o verify não grava o cookie de sessão e devolve o\n * `accessToken` no resultado. Usado em fluxos como SSO em que o token\n * vai pra outro destino (callback de app) e não pode derrubar a\n * sessão atual do Great no navegador.\n */\n setCookie?: boolean;\n }) => {\n const { verifyTwoFactorAction } = await import('../actions/verify-two-factor.action');\n return withAction(() => verifyTwoFactorAction(cookie, code, { window, setCookie }))();\n },\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: userKey });\n queryClient.invalidateQueries({ queryKey: twoFactorKey });\n },\n });\n}\n\nexport function useInvalidateUser() {\n const queryClient = useQueryClient();\n const userKey = useWlQueryKey([...USER_QUERY_KEY]);\n return () => queryClient.invalidateQueries({ queryKey: userKey });\n}\n\nexport function useSetUserData() {\n const queryClient = useQueryClient();\n const userKey = useWlQueryKey([...USER_QUERY_KEY]);\n return (user: User | null) => queryClient.setQueryData(userKey, user);\n}\n"],"mappings":";AAEA,SAAS,aAAa,UAAU,sBAAuC;AAEvE,SAAS,kBAAkB;AAC3B,SAAS,qBAAqB;AAEvB,MAAM,iBAAiB,CAAC,MAAM;AAC9B,MAAM,4BAA4B,CAAC,uBAAuB;AAEjE,eAAe,YAAkC;AAC/C,QAAM,EAAE,cAAc,kBAAkB,IAAI,MAAM,OAAO,2CAA2C;AACpG,QAAM,SAAS,MAAM,kBAAkB;AACvC,SAAO,OAAO,WAAW,OAAO,OAAO,OAAO,OAAO;AACvD;AAEA,eAAe,sBAAwC;AACrD,QAAM,EAAE,sBAAsB,IAAI,MAAM,OAAO,oCAAoC;AACnF,SAAO,MAAM,sBAAsB;AACrC;AAEO,SAAS,eAAe;AAC7B,QAAM,WAAW,cAAc,CAAC,GAAG,cAAc,CAAC;AAElD,SAAO,SAAS;AAAA,IACd;AAAA,IACA,SAAS;AAAA,IACT,WAAW,KAAK;AAAA,IAChB,QAAQ,KAAK,KAAK;AAAA,IAClB,OAAO;AAAA,EACT,CAAC;AACH;AAEO,SAAS,uBAAuB,SAA2B;AAChE,QAAM,WAAW,cAAc,CAAC,GAAG,yBAAyB,CAAC;AAE7D,SAAO,SAAS;AAAA,IACd;AAAA,IACA,SAAS;AAAA,IACT,OAAO;AAAA,IACP,WAAW,IAAI,KAAK;AAAA,IACpB,GAAG;AAAA,IACH,gBAAgB;AAAA,IAChB,sBAAsB;AAAA,EACxB,CAAC;AACH;AAEO,SAAS,qBAAqB;AACnC,QAAM,cAAc,eAAe;AACnC,QAAM,UAAU,cAAc,CAAC,GAAG,cAAc,CAAC;AACjD,QAAM,eAAe,cAAc,CAAC,oBAAoB,CAAC;AAEzD,SAAO,YAAY;AAAA,IACjB,YAAY,OAAO;AAAA,MACjB;AAAA,MACA;AAAA,MACA;AAAA,MACA;AAAA,IACF,MAWM;AACJ,YAAM,EAAE,sBAAsB,IAAI,MAAM,OAAO,qCAAqC;AACpF,aAAO,WAAW,MAAM,sBAAsB,QAAQ,MAAM,EAAE,QAAQ,UAAU,CAAC,CAAC,EAAE;AAAA,IACtF;AAAA,IACA,WAAW,MAAM;AACf,kBAAY,kBAAkB,EAAE,UAAU,QAAQ,CAAC;AACnD,kBAAY,kBAAkB,EAAE,UAAU,aAAa,CAAC;AAAA,IAC1D;AAAA,EACF,CAAC;AACH;AAEO,SAAS,oBAAoB;AAClC,QAAM,cAAc,eAAe;AACnC,QAAM,UAAU,cAAc,CAAC,GAAG,cAAc,CAAC;AACjD,SAAO,MAAM,YAAY,kBAAkB,EAAE,UAAU,QAAQ,CAAC;AAClE;AAEO,SAAS,iBAAiB;AAC/B,QAAM,cAAc,eAAe;AACnC,QAAM,UAAU,cAAc,CAAC,GAAG,cAAc,CAAC;AACjD,SAAO,CAAC,SAAsB,YAAY,aAAa,SAAS,IAAI;AACtE;","names":[]}
|
|
@@ -13,7 +13,7 @@ const COOKIE_OPTIONS = {
|
|
|
13
13
|
path: "/"
|
|
14
14
|
};
|
|
15
15
|
class AuthService {
|
|
16
|
-
async login(credentials, clientInfo) {
|
|
16
|
+
async login(credentials, clientInfo, options) {
|
|
17
17
|
let requestConfig;
|
|
18
18
|
if (credentials.id_wl) {
|
|
19
19
|
const wlToken = await whitelabelService.getTokenByWhitelabelId(
|
|
@@ -51,6 +51,9 @@ class AuthService {
|
|
|
51
51
|
if (response.two_factor_required) {
|
|
52
52
|
return { result: "two_factor_required", cookie: response.cookie, twoFactorMode: response.two_factor_required };
|
|
53
53
|
}
|
|
54
|
+
if (options?.setCookie === false) {
|
|
55
|
+
return { result: "success", accessToken: response.cookie };
|
|
56
|
+
}
|
|
54
57
|
await this.setAuthCookie(response.cookie);
|
|
55
58
|
const [{ userService }, { accountService }] = await Promise.all([
|
|
56
59
|
import("../../users/services/user.service"),
|
|
@@ -95,6 +98,9 @@ class AuthService {
|
|
|
95
98
|
500
|
|
96
99
|
);
|
|
97
100
|
}
|
|
101
|
+
if (options?.setCookie === false) {
|
|
102
|
+
return { status: 1, accessToken: response.data.cookie };
|
|
103
|
+
}
|
|
98
104
|
await this.setAuthCookie(response.data.cookie);
|
|
99
105
|
return { status: 1 };
|
|
100
106
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/auth/services/auth.service.ts"],"sourcesContent":["import { cookies } from \"next/headers\";\r\n\r\nimport { api, type RequestConfig } from \"../../../infra/api/client\";\r\nimport { ApiError } from \"../../../infra/api/types\";\r\nimport { whitelabelService } from \"../../whitelabel/services/whitelabel.service\";\r\nimport { buildWlOverrideFromJwt } from \"../utils/build-wl-override\";\r\nimport {\r\n ClientInfo,\r\n ForgotPasswordRequest,\r\n ForgotPasswordResponse,\r\n GeoLocation,\r\n LoginApiResponse,\r\n LoginRequest,\r\n LoginResponse,\r\n LogoutApiResponse,\r\n LogoutRequest,\r\n LogoutResponse,\r\n RegisterApiRequest,\r\n RegisterApiResponse,\r\n RegisterRequest,\r\n RegisterResponse,\r\n ResendVerificationRequest,\r\n ResendVerificationResponse,\r\n ResetPasswordRequest,\r\n ResetPasswordResponse,\r\n SearchPlansApiResponse,\r\n SessionKeepRequest,\r\n SessionKeepResponse,\r\n SocialGoogleApiResponse,\r\n SocialGoogleResponse,\r\n SocialOnboardingApiResponse,\r\n SocialOnboardingRequest,\r\n SocialOnboardingResponse,\r\n TwoFactorApiResponse,\r\n TwoFactorRequest,\r\n TwoFactorResponse,\r\n UnlinkGoogleApiResponse,\r\n UnlinkGoogleResponse,\r\n VerifyEmailRequest,\r\n VerifyEmailResponse,\r\n} from \"../schema\";\r\nimport { findWhitelabel } from \"../../../server\";\r\n\r\nconst AUTH_COOKIE_NAME = \"greatapps\";\r\nconst COOKIE_MAX_AGE = 60 * 60 * 24 * 30;\r\n\r\nconst COOKIE_OPTIONS = {\r\n httpOnly: true,\r\n secure: process.env.NODE_ENV === \"production\",\r\n sameSite: \"lax\" as const,\r\n path: \"/\",\r\n};\r\n\r\nclass AuthService {\r\n async login(\r\n credentials: LoginRequest,\r\n clientInfo: ClientInfo,\r\n ): Promise<LoginResponse> {\r\n let requestConfig: RequestConfig | undefined;\r\n if (credentials.id_wl) {\r\n const wlToken = await whitelabelService.getTokenByWhitelabelId(\r\n credentials.id_wl,\r\n );\r\n requestConfig = { whiteLabelId: credentials.id_wl, authToken: wlToken };\r\n }\r\n\r\n const response = await api.apps.post<LoginApiResponse>(\r\n \"/auth/login\",\r\n {\r\n email: credentials.email,\r\n password: credentials.password,\r\n source: credentials?.source,\r\n location: clientInfo.location,\r\n ip: clientInfo.ip,\r\n timezone: clientInfo.timezone,\r\n agent: clientInfo.agent,\r\n },\r\n requestConfig,\r\n );\r\n\r\n if (response.status === 0) {\r\n throw new ApiError(\r\n response.message || \"E-mail ou senha incorretos\",\r\n response.code || \"LOGIN_FAILED\",\r\n 401,\r\n );\r\n }\r\n\r\n if (!response.cookie) {\r\n throw new ApiError(\r\n \"Resposta de autenticação inválida\",\r\n \"INVALID_RESPONSE\",\r\n 500,\r\n );\r\n }\r\n\r\n if (response.two_factor_required) {\r\n return { result: \"two_factor_required\", cookie: response.cookie, twoFactorMode: response.two_factor_required };\r\n }\r\n\r\n await this.setAuthCookie(response.cookie);\r\n\r\n const [{ userService }, { accountService }] = await Promise.all([\r\n import(\"../../users/services/user.service\"),\r\n import(\"../../accounts/services/account.service\"),\r\n ]);\r\n const [user, account] = await Promise.all([\r\n userService.findById(\r\n requestConfig ? { authToken: requestConfig.authToken } : undefined,\r\n ),\r\n accountService.findCurrentAccount(requestConfig),\r\n ]);\r\n\r\n return {\r\n result: \"success\",\r\n user,\r\n account,\r\n accessToken: response.cookie,\r\n refreshToken: \"\",\r\n expiresAt: new Date(Date.now() + COOKIE_MAX_AGE * 1000).toISOString(),\r\n };\r\n }\r\n\r\n async verifyTwoFactor(\r\n cookie: string,\r\n code: string,\r\n clientInfo: ClientInfo,\r\n options?: { window?: number },\r\n ): Promise<TwoFactorResponse> {\r\n const payload: TwoFactorRequest = {\r\n location: clientInfo.location,\r\n ip: clientInfo.ip,\r\n timezone: clientInfo.timezone,\r\n agent: clientInfo.agent,\r\n cookie,\r\n code,\r\n };\r\n\r\n const endpoint = options?.window !== undefined ? `/auth/code?window=${options.window}` : '/auth/code';\r\n const response = await api.apps.post<TwoFactorApiResponse>(\r\n endpoint,\r\n payload,\r\n );\r\n\r\n if (response.status === 0) {\r\n throw new ApiError(\"Código 2FA inválido\", \"TWO_FACTOR_FAILED\", 401);\r\n }\r\n\r\n if (!response?.data?.cookie) {\r\n throw new ApiError(\r\n \"Resposta de autenticação inválida após 2FA\",\r\n \"INVALID_RESPONSE\",\r\n 500,\r\n );\r\n }\r\n\r\n await this.setAuthCookie(response.data.cookie);\r\n\r\n return { status: 1 };\r\n }\r\n\r\n async socialLoginGoogle(\r\n code: string,\r\n clientInfo: ClientInfo,\r\n ): Promise<SocialGoogleResponse> {\r\n const response = await api.apps.post<SocialGoogleApiResponse>(\r\n \"/auth/social/google\",\r\n {\r\n code,\r\n location: clientInfo.location,\r\n ip: clientInfo.ip,\r\n timezone: clientInfo.timezone,\r\n agent: clientInfo.agent,\r\n verification: true,\r\n },\r\n );\r\n\r\n if (response.status === 0) {\r\n if (response.code === \"link_requires_password\") {\r\n return {\r\n result: \"link_requires_password\",\r\n message:\r\n response.message ||\r\n \"Uma conta com esse e-mail já existe. Faça login com e-mail e senha para vincular sua conta Google.\",\r\n };\r\n }\r\n throw new ApiError(\r\n response.message || \"Falha no login com Google\",\r\n response.code || \"GOOGLE_LOGIN_FAILED\",\r\n 401,\r\n );\r\n }\r\n\r\n if (response.needs_onboarding) {\r\n if (!response.onboarding_token || !response.partial?.email) {\r\n throw new ApiError(\r\n \"Resposta de onboarding inválida\",\r\n \"INVALID_RESPONSE\",\r\n 500,\r\n );\r\n }\r\n return {\r\n result: \"needs_onboarding\",\r\n onboardingToken: response.onboarding_token,\r\n partial: response.partial,\r\n };\r\n }\r\n\r\n if (!response.cookie) {\r\n throw new ApiError(\r\n \"Resposta de autenticação inválida\",\r\n \"INVALID_RESPONSE\",\r\n 500,\r\n );\r\n }\r\n\r\n if (response.two_factor_required) {\r\n return {\r\n result: \"two_factor_required\",\r\n cookie: response.cookie,\r\n twoFactorMode: response.two_factor_required,\r\n };\r\n }\r\n\r\n await this.setAuthCookie(response.cookie);\r\n\r\n const [{ userService }, { accountService }] = await Promise.all([\r\n import(\"../../users/services/user.service\"),\r\n import(\"../../accounts/services/account.service\"),\r\n ]);\r\n const [user, account] = await Promise.all([\r\n userService.findById(),\r\n accountService.findCurrentAccount(),\r\n ]);\r\n\r\n return {\r\n result: \"success\",\r\n user,\r\n account,\r\n accessToken: response.cookie,\r\n expiresAt: new Date(Date.now() + COOKIE_MAX_AGE * 1000).toISOString(),\r\n };\r\n }\r\n\r\n async completeGoogleOnboarding(\r\n data: SocialOnboardingRequest,\r\n clientInfo: ClientInfo,\r\n ): Promise<SocialOnboardingResponse> {\r\n const today = new Date();\r\n const trialEndDate = new Date(today);\r\n const trialDays = Math.min(Math.max(data.trialDays ?? 7, 1), 90);\r\n trialEndDate.setDate(today.getDate() + trialDays);\r\n\r\n const idPlan = await this.resolvePlanId(data.idPlan);\r\n\r\n const payload = {\r\n onboarding_token: data.onboardingToken,\r\n name: data.user.name,\r\n bussiness_type: 0,\r\n language: \"pt-br\",\r\n timezone: \"America/Sao_Paulo\",\r\n currency: \"BRL\",\r\n location: clientInfo.location,\r\n ip: clientInfo.ip,\r\n agent: clientInfo.agent,\r\n id_affiliate: data.affiliateId || 0,\r\n origin: data.origin,\r\n user: {\r\n id_api: \"\",\r\n name: data.user.name || \"\",\r\n last_name: data.user.last_name || \"\",\r\n rg: data.user.rg || \"\",\r\n cpf: data.user.cpf || \"\",\r\n gender: data.user.gender ?? 1,\r\n ddi: data.user.ddi || \"55\",\r\n phone: data.user.phone || \"\",\r\n profile: \"owner\",\r\n language: \"pt-br\",\r\n },\r\n subscription:\r\n idPlan === -1\r\n ? {\r\n type: \"free\",\r\n id_coupon: data.couponId || 0,\r\n id_plan: 5,\r\n id_product: 1,\r\n }\r\n : {\r\n type: \"trial\",\r\n id_coupon: data.couponId || 0,\r\n id_plan: idPlan,\r\n date_due: trialEndDate.toISOString().split(\"T\")[0],\r\n trial_days: trialDays,\r\n id_product: 1,\r\n },\r\n };\r\n\r\n const response = await api.apps.post<SocialOnboardingApiResponse>(\r\n \"/auth/social/onboarding\",\r\n payload,\r\n );\r\n\r\n if (response.status === 0) {\r\n throw new ApiError(\r\n response.message || \"Erro ao finalizar cadastro com Google\",\r\n \"ONBOARDING_FAILED\",\r\n 400,\r\n );\r\n }\r\n\r\n if (!response.data?.length || !response.cookie) {\r\n throw new ApiError(\r\n \"Resposta de cadastro inválida\",\r\n \"INVALID_RESPONSE\",\r\n 500,\r\n );\r\n }\r\n\r\n await this.setAuthCookie(response.cookie);\r\n\r\n const [{ userService }, { accountService }] = await Promise.all([\r\n import(\"../../users/services/user.service\"),\r\n import(\"../../accounts/services/account.service\"),\r\n ]);\r\n const [user, account] = await Promise.all([\r\n userService.findById(),\r\n accountService.findCurrentAccount(),\r\n ]);\r\n\r\n return {\r\n user,\r\n account,\r\n accessToken: response.cookie,\r\n expiresAt: new Date(Date.now() + COOKIE_MAX_AGE * 1000).toISOString(),\r\n };\r\n }\r\n\r\n async unlinkGoogle(): Promise<UnlinkGoogleResponse> {\r\n const { id_account, id_user } = await import(\r\n \"../utils/get-user-context\"\r\n ).then((m) => m.getUserContext());\r\n\r\n const response = await api.apps.delete<UnlinkGoogleApiResponse>(\r\n `/accounts/${id_account}/users/${id_user}/social/google`,\r\n );\r\n\r\n if (response.status === 0) {\r\n throw new ApiError(\r\n response.message || \"Erro ao desvincular conta Google\",\r\n \"UNLINK_FAILED\",\r\n 400,\r\n );\r\n }\r\n\r\n return {\r\n success: true,\r\n message: response.message,\r\n };\r\n }\r\n\r\n async register(\r\n data: RegisterRequest,\r\n clientInfo: ClientInfo,\r\n ): Promise<RegisterResponse> {\r\n const today = new Date();\r\n const trialEndDate = new Date(today);\r\n const trialDays = Math.min(Math.max(data.trialDays ?? 7, 1), 90);\r\n trialEndDate.setDate(today.getDate() + trialDays);\r\n\r\n const idPlan = await this.resolvePlanId(data.idPlan);\r\n\r\n const payload: RegisterApiRequest = {\r\n name: data.accountName,\r\n bussiness_type: data.businessType ?? 0,\r\n language: \"pt-br\",\r\n timezone: \"America/Sao_Paulo\",\r\n currency: \"BRL\",\r\n location: clientInfo.location,\r\n ip: clientInfo.ip,\r\n agent: clientInfo.agent,\r\n id_affiliate: data.affiliateId || 0,\r\n origin: data.origin,\r\n user: {\r\n id_api: \"\",\r\n name: data.name,\r\n last_name: data.lastName || \"\",\r\n rg: data.rg || \"\",\r\n cpf: data.cpf || \"\",\r\n gender: data.gender,\r\n email: data.email,\r\n phone: data.phone,\r\n password: data.password,\r\n profile: \"owner\",\r\n language: \"pt-br\",\r\n },\r\n subscription:\r\n idPlan === -1\r\n ? {\r\n type: \"free\",\r\n id_coupon: data.couponId || 0,\r\n id_plan: 5, // Plano Free (ID fixo)\r\n id_product: 1,\r\n }\r\n : {\r\n type: \"trial\",\r\n id_coupon: data.couponId || 0,\r\n id_plan: idPlan,\r\n // Fluxo não-Stripe lê `date_due`; fluxo Stripe lê `trial_days`.\r\n // Mandamos os dois pra cobrir ambos os caminhos da API.\r\n date_due: trialEndDate.toISOString().split(\"T\")[0],\r\n trial_days: trialDays,\r\n id_product: 1,\r\n },\r\n };\r\n\r\n const response = await api.apps.post<RegisterApiResponse>(\r\n \"/accounts\",\r\n payload,\r\n );\r\n\r\n if (response.status === 0) {\r\n throw new ApiError(\r\n response.message || \"Erro ao criar conta\",\r\n \"REGISTER_FAILED\",\r\n 400,\r\n );\r\n }\r\n\r\n if (!response.data || response.data.length === 0) {\r\n throw new ApiError(\r\n \"Resposta de registro inválida\",\r\n \"INVALID_RESPONSE\",\r\n 500,\r\n );\r\n }\r\n\r\n if (!response.cookie) {\r\n throw new ApiError(\r\n \"Resposta de autenticação inválida\",\r\n \"INVALID_RESPONSE\",\r\n 500,\r\n );\r\n }\r\n\r\n const accountData = response.data[0];\r\n\r\n await this.setAuthCookie(response.cookie);\r\n\r\n const [{ userService }, { accountService }] = await Promise.all([\r\n import(\"../../users/services/user.service\"),\r\n import(\"../../accounts/services/account.service\"),\r\n ]);\r\n const [user, account] = await Promise.all([\r\n userService.findById(),\r\n accountService.findCurrentAccount(),\r\n ]);\r\n\r\n return {\r\n user,\r\n account,\r\n accessToken: response.cookie,\r\n refreshToken: \"\",\r\n expiresAt: new Date(Date.now() + COOKIE_MAX_AGE * 1000).toISOString(),\r\n requiresEmailVerification: !accountData.verified,\r\n };\r\n }\r\n\r\n async logout(clientInfo: ClientInfo): Promise<LogoutResponse> {\r\n const cookie = await this.getToken();\r\n\r\n if (!cookie) {\r\n throw new ApiError(\r\n \"Usuário não autenticado\",\r\n \"NOT_AUTHENTICATED_LOGOUT\",\r\n 401\r\n );\r\n }\r\n\r\n const payload: LogoutRequest = {\r\n location: clientInfo.location,\r\n ip: clientInfo.ip,\r\n timezone: clientInfo.timezone,\r\n agent: clientInfo.agent,\r\n cookie,\r\n };\r\n\r\n try {\r\n const response = await api.apps.post<LogoutApiResponse>(\r\n \"/auth/logout\",\r\n payload,\r\n );\r\n\r\n if (response.status === 0) {\r\n throw new ApiError(\r\n response.message || \"Erro ao realizar logout\",\r\n response.code || \"LOGOUT_FAILED\",\r\n 400,\r\n );\r\n }\r\n } finally {\r\n await this.removeAuthCookie();\r\n }\r\n\r\n return {\r\n success: true,\r\n };\r\n }\r\n\r\n async forgotPassword(\r\n _data: ForgotPasswordRequest,\r\n ): Promise<ForgotPasswordResponse> {\r\n throw new ApiError(\r\n \"Recuperação de senha não implementada\",\r\n \"NOT_IMPLEMENTED\",\r\n 501,\r\n );\r\n }\r\n\r\n async resetPassword(\r\n _data: ResetPasswordRequest,\r\n ): Promise<ResetPasswordResponse> {\r\n throw new ApiError(\r\n \"Redefinição de senha não implementada\",\r\n \"NOT_IMPLEMENTED\",\r\n 501,\r\n );\r\n }\r\n\r\n async verifyEmail(_data: VerifyEmailRequest): Promise<VerifyEmailResponse> {\r\n throw new ApiError(\r\n \"Verificação de email não implementada\",\r\n \"NOT_IMPLEMENTED\",\r\n 501,\r\n );\r\n }\r\n\r\n async resendVerification(\r\n _data: ResendVerificationRequest,\r\n ): Promise<ResendVerificationResponse> {\r\n throw new ApiError(\r\n \"Reenvio de verificação não implementado\",\r\n \"NOT_IMPLEMENTED\",\r\n 501,\r\n );\r\n }\r\n\r\n async validateSession(clientInfo: ClientInfo): Promise<boolean> {\r\n const cookie = await this.getToken();\r\n\r\n if (!cookie) {\r\n return false;\r\n }\r\n\r\n try {\r\n const requestConfig = await buildWlOverrideFromJwt(cookie);\r\n\r\n const payload: SessionKeepRequest = {\r\n location: clientInfo.location,\r\n ip: clientInfo.ip,\r\n timezone: clientInfo.timezone,\r\n agent: clientInfo.agent,\r\n cookie,\r\n };\r\n\r\n const response = await api.apps.post<SessionKeepResponse>(\r\n \"/auth/keep\",\r\n payload,\r\n requestConfig,\r\n );\r\n\r\n return response.status === 1;\r\n } catch (error) {\r\n console.error(\"[AuthService] validateSession error\", error);\r\n return false;\r\n }\r\n }\r\n\r\n async isAuthenticated(): Promise<boolean> {\r\n const token = await this.getToken();\r\n return !!token;\r\n }\r\n\r\n async getToken(): Promise<string | undefined> {\r\n if (process.env.DUMMY_AUTH_TOKEN) return process.env.DUMMY_AUTH_TOKEN;\r\n const cookieStore = await cookies();\r\n return cookieStore.get(AUTH_COOKIE_NAME)?.value;\r\n }\r\n\r\n private async resolvePlanId(idPlan?: number | string | null): Promise<number> {\r\n if (idPlan == null || idPlan === \"\") return -1;\r\n if (typeof idPlan === \"number\" || Number(idPlan)) return Number(idPlan);\r\n\r\n if (typeof idPlan === \"string\") {\r\n const response = await api.apps.get<SearchPlansApiResponse>(\r\n `/plans?search=${encodeURIComponent(idPlan)}`,\r\n );\r\n\r\n if (response.status === 1 && response.data?.length) {\r\n return response.data[0].id;\r\n }\r\n\r\n throw new ApiError(\r\n `Plano \"${idPlan}\" não encontrado`,\r\n \"PLAN_NOT_FOUND\",\r\n 404,\r\n );\r\n }\r\n return -1;\r\n }\r\n\r\n private async setAuthCookie(token: string): Promise<void> {\r\n const cookieStore = await cookies();\r\n const whitelabel = await findWhitelabel().catch(() => null);\r\n const cookieDomain =\r\n this.normalizeCookieDomain(whitelabel?.domain);\r\n\r\n cookieStore.set(AUTH_COOKIE_NAME, token, {\r\n ...COOKIE_OPTIONS,\r\n ...(cookieDomain ? { domain: cookieDomain } : {}),\r\n maxAge: COOKIE_MAX_AGE,\r\n });\r\n }\r\n\r\n async removeAuthCookie(): Promise<void> {\r\n const cookieStore = await cookies();\r\n const whitelabel = await findWhitelabel().catch(() => null);\r\n const cookieDomain =\r\n this.normalizeCookieDomain(whitelabel?.domain);\r\n\r\n cookieStore.delete({\r\n name: AUTH_COOKIE_NAME,\r\n ...COOKIE_OPTIONS,\r\n ...(cookieDomain ? { domain: cookieDomain } : {}),\r\n });\r\n }\r\n\r\n private normalizeCookieDomain(domain?: string | null): string | undefined {\r\n if (!domain) return undefined;\r\n\r\n const normalized = domain.trim();\r\n if (!normalized) return undefined;\r\n\r\n const rawHost = (() => {\r\n try {\r\n return new URL(normalized).hostname;\r\n } catch {\r\n return normalized\r\n .replace(/^https?:\\/\\//i, \"\")\r\n .replace(/^www\\./i, \"\")\r\n .split(\"/\")[0]\r\n .split(\":\")[0];\r\n }\r\n })();\r\n\r\n if (!rawHost || rawHost === \"localhost\") {\r\n return undefined;\r\n }\r\n\r\n return rawHost.startsWith(\".\") ? rawHost : `.${rawHost}`;\r\n }\r\n}\r\n\r\nexport const authService = new AuthService();\r\n\r\nexport type { ClientInfo, GeoLocation };\r\n"],"mappings":"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","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/modules/auth/services/auth.service.ts"],"sourcesContent":["import { cookies } from \"next/headers\";\r\n\r\nimport { api, type RequestConfig } from \"../../../infra/api/client\";\r\nimport { ApiError } from \"../../../infra/api/types\";\r\nimport { whitelabelService } from \"../../whitelabel/services/whitelabel.service\";\r\nimport { buildWlOverrideFromJwt } from \"../utils/build-wl-override\";\r\nimport {\r\n ClientInfo,\r\n ForgotPasswordRequest,\r\n ForgotPasswordResponse,\r\n GeoLocation,\r\n LoginApiResponse,\r\n LoginRequest,\r\n LoginResponse,\r\n LogoutApiResponse,\r\n LogoutRequest,\r\n LogoutResponse,\r\n RegisterApiRequest,\r\n RegisterApiResponse,\r\n RegisterRequest,\r\n RegisterResponse,\r\n ResendVerificationRequest,\r\n ResendVerificationResponse,\r\n ResetPasswordRequest,\r\n ResetPasswordResponse,\r\n SearchPlansApiResponse,\r\n SessionKeepRequest,\r\n SessionKeepResponse,\r\n SocialGoogleApiResponse,\r\n SocialGoogleResponse,\r\n SocialOnboardingApiResponse,\r\n SocialOnboardingRequest,\r\n SocialOnboardingResponse,\r\n IsolatedLoginResponse,\r\n TwoFactorApiResponse,\r\n TwoFactorRequest,\r\n TwoFactorResponse,\r\n UnlinkGoogleApiResponse,\r\n UnlinkGoogleResponse,\r\n VerifyEmailRequest,\r\n VerifyEmailResponse,\r\n} from \"../schema\";\r\nimport { findWhitelabel } from \"../../../server\";\r\n\r\nconst AUTH_COOKIE_NAME = \"greatapps\";\r\nconst COOKIE_MAX_AGE = 60 * 60 * 24 * 30;\r\n\r\nconst COOKIE_OPTIONS = {\r\n httpOnly: true,\r\n secure: process.env.NODE_ENV === \"production\",\r\n sameSite: \"lax\" as const,\r\n path: \"/\",\r\n};\r\n\r\nclass AuthService {\r\n async login(\r\n credentials: LoginRequest,\r\n clientInfo: ClientInfo,\r\n ): Promise<LoginResponse>;\r\n async login(\r\n credentials: LoginRequest,\r\n clientInfo: ClientInfo,\r\n options: { setCookie: false },\r\n ): Promise<IsolatedLoginResponse>;\r\n async login(\r\n credentials: LoginRequest,\r\n clientInfo: ClientInfo,\r\n options?: { setCookie?: boolean },\r\n ): Promise<LoginResponse | IsolatedLoginResponse>;\r\n async login(\r\n credentials: LoginRequest,\r\n clientInfo: ClientInfo,\r\n options?: { setCookie?: boolean },\r\n ): Promise<LoginResponse | IsolatedLoginResponse> {\r\n let requestConfig: RequestConfig | undefined;\r\n if (credentials.id_wl) {\r\n const wlToken = await whitelabelService.getTokenByWhitelabelId(\r\n credentials.id_wl,\r\n );\r\n requestConfig = { whiteLabelId: credentials.id_wl, authToken: wlToken };\r\n }\r\n\r\n const response = await api.apps.post<LoginApiResponse>(\r\n \"/auth/login\",\r\n {\r\n email: credentials.email,\r\n password: credentials.password,\r\n source: credentials?.source,\r\n location: clientInfo.location,\r\n ip: clientInfo.ip,\r\n timezone: clientInfo.timezone,\r\n agent: clientInfo.agent,\r\n },\r\n requestConfig,\r\n );\r\n\r\n if (response.status === 0) {\r\n throw new ApiError(\r\n response.message || \"E-mail ou senha incorretos\",\r\n response.code || \"LOGIN_FAILED\",\r\n 401,\r\n );\r\n }\r\n\r\n if (!response.cookie) {\r\n throw new ApiError(\r\n \"Resposta de autenticação inválida\",\r\n \"INVALID_RESPONSE\",\r\n 500,\r\n );\r\n }\r\n\r\n if (response.two_factor_required) {\r\n return { result: \"two_factor_required\", cookie: response.cookie, twoFactorMode: response.two_factor_required };\r\n }\r\n\r\n // Modo isolado: caller só quer o token, sem afetar a sessão do navegador\r\n // nem pagar pelas chamadas de user/account (ex.: fluxo de SSO).\r\n if (options?.setCookie === false) {\r\n return { result: \"success\", accessToken: response.cookie };\r\n }\r\n\r\n await this.setAuthCookie(response.cookie);\r\n\r\n const [{ userService }, { accountService }] = await Promise.all([\r\n import(\"../../users/services/user.service\"),\r\n import(\"../../accounts/services/account.service\"),\r\n ]);\r\n const [user, account] = await Promise.all([\r\n userService.findById(\r\n requestConfig ? { authToken: requestConfig.authToken } : undefined,\r\n ),\r\n accountService.findCurrentAccount(requestConfig),\r\n ]);\r\n\r\n return {\r\n result: \"success\",\r\n user,\r\n account,\r\n accessToken: response.cookie,\r\n refreshToken: \"\",\r\n expiresAt: new Date(Date.now() + COOKIE_MAX_AGE * 1000).toISOString(),\r\n };\r\n }\r\n\r\n async verifyTwoFactor(\r\n cookie: string,\r\n code: string,\r\n clientInfo: ClientInfo,\r\n options?: { window?: number; setCookie?: boolean },\r\n ): Promise<TwoFactorResponse> {\r\n const payload: TwoFactorRequest = {\r\n location: clientInfo.location,\r\n ip: clientInfo.ip,\r\n timezone: clientInfo.timezone,\r\n agent: clientInfo.agent,\r\n cookie,\r\n code,\r\n };\r\n\r\n const endpoint = options?.window !== undefined ? `/auth/code?window=${options.window}` : '/auth/code';\r\n const response = await api.apps.post<TwoFactorApiResponse>(\r\n endpoint,\r\n payload,\r\n );\r\n\r\n if (response.status === 0) {\r\n throw new ApiError(\"Código 2FA inválido\", \"TWO_FACTOR_FAILED\", 401);\r\n }\r\n\r\n if (!response?.data?.cookie) {\r\n throw new ApiError(\r\n \"Resposta de autenticação inválida após 2FA\",\r\n \"INVALID_RESPONSE\",\r\n 500,\r\n );\r\n }\r\n\r\n // Modo isolado: devolve o token sem gravar o cookie — o caller redireciona\r\n // pra outro lugar (ex.: SSO callback) e não quer mexer na sessão atual.\r\n if (options?.setCookie === false) {\r\n return { status: 1, accessToken: response.data.cookie };\r\n }\r\n\r\n await this.setAuthCookie(response.data.cookie);\r\n\r\n return { status: 1 };\r\n }\r\n\r\n async socialLoginGoogle(\r\n code: string,\r\n clientInfo: ClientInfo,\r\n ): Promise<SocialGoogleResponse> {\r\n const response = await api.apps.post<SocialGoogleApiResponse>(\r\n \"/auth/social/google\",\r\n {\r\n code,\r\n location: clientInfo.location,\r\n ip: clientInfo.ip,\r\n timezone: clientInfo.timezone,\r\n agent: clientInfo.agent,\r\n verification: true,\r\n },\r\n );\r\n\r\n if (response.status === 0) {\r\n if (response.code === \"link_requires_password\") {\r\n return {\r\n result: \"link_requires_password\",\r\n message:\r\n response.message ||\r\n \"Uma conta com esse e-mail já existe. Faça login com e-mail e senha para vincular sua conta Google.\",\r\n };\r\n }\r\n throw new ApiError(\r\n response.message || \"Falha no login com Google\",\r\n response.code || \"GOOGLE_LOGIN_FAILED\",\r\n 401,\r\n );\r\n }\r\n\r\n if (response.needs_onboarding) {\r\n if (!response.onboarding_token || !response.partial?.email) {\r\n throw new ApiError(\r\n \"Resposta de onboarding inválida\",\r\n \"INVALID_RESPONSE\",\r\n 500,\r\n );\r\n }\r\n return {\r\n result: \"needs_onboarding\",\r\n onboardingToken: response.onboarding_token,\r\n partial: response.partial,\r\n };\r\n }\r\n\r\n if (!response.cookie) {\r\n throw new ApiError(\r\n \"Resposta de autenticação inválida\",\r\n \"INVALID_RESPONSE\",\r\n 500,\r\n );\r\n }\r\n\r\n if (response.two_factor_required) {\r\n return {\r\n result: \"two_factor_required\",\r\n cookie: response.cookie,\r\n twoFactorMode: response.two_factor_required,\r\n };\r\n }\r\n\r\n await this.setAuthCookie(response.cookie);\r\n\r\n const [{ userService }, { accountService }] = await Promise.all([\r\n import(\"../../users/services/user.service\"),\r\n import(\"../../accounts/services/account.service\"),\r\n ]);\r\n const [user, account] = await Promise.all([\r\n userService.findById(),\r\n accountService.findCurrentAccount(),\r\n ]);\r\n\r\n return {\r\n result: \"success\",\r\n user,\r\n account,\r\n accessToken: response.cookie,\r\n expiresAt: new Date(Date.now() + COOKIE_MAX_AGE * 1000).toISOString(),\r\n };\r\n }\r\n\r\n async completeGoogleOnboarding(\r\n data: SocialOnboardingRequest,\r\n clientInfo: ClientInfo,\r\n ): Promise<SocialOnboardingResponse> {\r\n const today = new Date();\r\n const trialEndDate = new Date(today);\r\n const trialDays = Math.min(Math.max(data.trialDays ?? 7, 1), 90);\r\n trialEndDate.setDate(today.getDate() + trialDays);\r\n\r\n const idPlan = await this.resolvePlanId(data.idPlan);\r\n\r\n const payload = {\r\n onboarding_token: data.onboardingToken,\r\n name: data.user.name,\r\n bussiness_type: 0,\r\n language: \"pt-br\",\r\n timezone: \"America/Sao_Paulo\",\r\n currency: \"BRL\",\r\n location: clientInfo.location,\r\n ip: clientInfo.ip,\r\n agent: clientInfo.agent,\r\n id_affiliate: data.affiliateId || 0,\r\n origin: data.origin,\r\n user: {\r\n id_api: \"\",\r\n name: data.user.name || \"\",\r\n last_name: data.user.last_name || \"\",\r\n rg: data.user.rg || \"\",\r\n cpf: data.user.cpf || \"\",\r\n gender: data.user.gender ?? 1,\r\n ddi: data.user.ddi || \"55\",\r\n phone: data.user.phone || \"\",\r\n profile: \"owner\",\r\n language: \"pt-br\",\r\n },\r\n subscription:\r\n idPlan === -1\r\n ? {\r\n type: \"free\",\r\n id_coupon: data.couponId || 0,\r\n id_plan: 5,\r\n id_product: 1,\r\n }\r\n : {\r\n type: \"trial\",\r\n id_coupon: data.couponId || 0,\r\n id_plan: idPlan,\r\n date_due: trialEndDate.toISOString().split(\"T\")[0],\r\n trial_days: trialDays,\r\n id_product: 1,\r\n },\r\n };\r\n\r\n const response = await api.apps.post<SocialOnboardingApiResponse>(\r\n \"/auth/social/onboarding\",\r\n payload,\r\n );\r\n\r\n if (response.status === 0) {\r\n throw new ApiError(\r\n response.message || \"Erro ao finalizar cadastro com Google\",\r\n \"ONBOARDING_FAILED\",\r\n 400,\r\n );\r\n }\r\n\r\n if (!response.data?.length || !response.cookie) {\r\n throw new ApiError(\r\n \"Resposta de cadastro inválida\",\r\n \"INVALID_RESPONSE\",\r\n 500,\r\n );\r\n }\r\n\r\n await this.setAuthCookie(response.cookie);\r\n\r\n const [{ userService }, { accountService }] = await Promise.all([\r\n import(\"../../users/services/user.service\"),\r\n import(\"../../accounts/services/account.service\"),\r\n ]);\r\n const [user, account] = await Promise.all([\r\n userService.findById(),\r\n accountService.findCurrentAccount(),\r\n ]);\r\n\r\n return {\r\n user,\r\n account,\r\n accessToken: response.cookie,\r\n expiresAt: new Date(Date.now() + COOKIE_MAX_AGE * 1000).toISOString(),\r\n };\r\n }\r\n\r\n async unlinkGoogle(): Promise<UnlinkGoogleResponse> {\r\n const { id_account, id_user } = await import(\r\n \"../utils/get-user-context\"\r\n ).then((m) => m.getUserContext());\r\n\r\n const response = await api.apps.delete<UnlinkGoogleApiResponse>(\r\n `/accounts/${id_account}/users/${id_user}/social/google`,\r\n );\r\n\r\n if (response.status === 0) {\r\n throw new ApiError(\r\n response.message || \"Erro ao desvincular conta Google\",\r\n \"UNLINK_FAILED\",\r\n 400,\r\n );\r\n }\r\n\r\n return {\r\n success: true,\r\n message: response.message,\r\n };\r\n }\r\n\r\n async register(\r\n data: RegisterRequest,\r\n clientInfo: ClientInfo,\r\n ): Promise<RegisterResponse> {\r\n const today = new Date();\r\n const trialEndDate = new Date(today);\r\n const trialDays = Math.min(Math.max(data.trialDays ?? 7, 1), 90);\r\n trialEndDate.setDate(today.getDate() + trialDays);\r\n\r\n const idPlan = await this.resolvePlanId(data.idPlan);\r\n\r\n const payload: RegisterApiRequest = {\r\n name: data.accountName,\r\n bussiness_type: data.businessType ?? 0,\r\n language: \"pt-br\",\r\n timezone: \"America/Sao_Paulo\",\r\n currency: \"BRL\",\r\n location: clientInfo.location,\r\n ip: clientInfo.ip,\r\n agent: clientInfo.agent,\r\n id_affiliate: data.affiliateId || 0,\r\n origin: data.origin,\r\n user: {\r\n id_api: \"\",\r\n name: data.name,\r\n last_name: data.lastName || \"\",\r\n rg: data.rg || \"\",\r\n cpf: data.cpf || \"\",\r\n gender: data.gender,\r\n email: data.email,\r\n phone: data.phone,\r\n password: data.password,\r\n profile: \"owner\",\r\n language: \"pt-br\",\r\n },\r\n subscription:\r\n idPlan === -1\r\n ? {\r\n type: \"free\",\r\n id_coupon: data.couponId || 0,\r\n id_plan: 5, // Plano Free (ID fixo)\r\n id_product: 1,\r\n }\r\n : {\r\n type: \"trial\",\r\n id_coupon: data.couponId || 0,\r\n id_plan: idPlan,\r\n // Fluxo não-Stripe lê `date_due`; fluxo Stripe lê `trial_days`.\r\n // Mandamos os dois pra cobrir ambos os caminhos da API.\r\n date_due: trialEndDate.toISOString().split(\"T\")[0],\r\n trial_days: trialDays,\r\n id_product: 1,\r\n },\r\n };\r\n\r\n const response = await api.apps.post<RegisterApiResponse>(\r\n \"/accounts\",\r\n payload,\r\n );\r\n\r\n if (response.status === 0) {\r\n throw new ApiError(\r\n response.message || \"Erro ao criar conta\",\r\n \"REGISTER_FAILED\",\r\n 400,\r\n );\r\n }\r\n\r\n if (!response.data || response.data.length === 0) {\r\n throw new ApiError(\r\n \"Resposta de registro inválida\",\r\n \"INVALID_RESPONSE\",\r\n 500,\r\n );\r\n }\r\n\r\n if (!response.cookie) {\r\n throw new ApiError(\r\n \"Resposta de autenticação inválida\",\r\n \"INVALID_RESPONSE\",\r\n 500,\r\n );\r\n }\r\n\r\n const accountData = response.data[0];\r\n\r\n await this.setAuthCookie(response.cookie);\r\n\r\n const [{ userService }, { accountService }] = await Promise.all([\r\n import(\"../../users/services/user.service\"),\r\n import(\"../../accounts/services/account.service\"),\r\n ]);\r\n const [user, account] = await Promise.all([\r\n userService.findById(),\r\n accountService.findCurrentAccount(),\r\n ]);\r\n\r\n return {\r\n user,\r\n account,\r\n accessToken: response.cookie,\r\n refreshToken: \"\",\r\n expiresAt: new Date(Date.now() + COOKIE_MAX_AGE * 1000).toISOString(),\r\n requiresEmailVerification: !accountData.verified,\r\n };\r\n }\r\n\r\n async logout(clientInfo: ClientInfo): Promise<LogoutResponse> {\r\n const cookie = await this.getToken();\r\n\r\n if (!cookie) {\r\n throw new ApiError(\r\n \"Usuário não autenticado\",\r\n \"NOT_AUTHENTICATED_LOGOUT\",\r\n 401\r\n );\r\n }\r\n\r\n const payload: LogoutRequest = {\r\n location: clientInfo.location,\r\n ip: clientInfo.ip,\r\n timezone: clientInfo.timezone,\r\n agent: clientInfo.agent,\r\n cookie,\r\n };\r\n\r\n try {\r\n const response = await api.apps.post<LogoutApiResponse>(\r\n \"/auth/logout\",\r\n payload,\r\n );\r\n\r\n if (response.status === 0) {\r\n throw new ApiError(\r\n response.message || \"Erro ao realizar logout\",\r\n response.code || \"LOGOUT_FAILED\",\r\n 400,\r\n );\r\n }\r\n } finally {\r\n await this.removeAuthCookie();\r\n }\r\n\r\n return {\r\n success: true,\r\n };\r\n }\r\n\r\n async forgotPassword(\r\n _data: ForgotPasswordRequest,\r\n ): Promise<ForgotPasswordResponse> {\r\n throw new ApiError(\r\n \"Recuperação de senha não implementada\",\r\n \"NOT_IMPLEMENTED\",\r\n 501,\r\n );\r\n }\r\n\r\n async resetPassword(\r\n _data: ResetPasswordRequest,\r\n ): Promise<ResetPasswordResponse> {\r\n throw new ApiError(\r\n \"Redefinição de senha não implementada\",\r\n \"NOT_IMPLEMENTED\",\r\n 501,\r\n );\r\n }\r\n\r\n async verifyEmail(_data: VerifyEmailRequest): Promise<VerifyEmailResponse> {\r\n throw new ApiError(\r\n \"Verificação de email não implementada\",\r\n \"NOT_IMPLEMENTED\",\r\n 501,\r\n );\r\n }\r\n\r\n async resendVerification(\r\n _data: ResendVerificationRequest,\r\n ): Promise<ResendVerificationResponse> {\r\n throw new ApiError(\r\n \"Reenvio de verificação não implementado\",\r\n \"NOT_IMPLEMENTED\",\r\n 501,\r\n );\r\n }\r\n\r\n async validateSession(clientInfo: ClientInfo): Promise<boolean> {\r\n const cookie = await this.getToken();\r\n\r\n if (!cookie) {\r\n return false;\r\n }\r\n\r\n try {\r\n const requestConfig = await buildWlOverrideFromJwt(cookie);\r\n\r\n const payload: SessionKeepRequest = {\r\n location: clientInfo.location,\r\n ip: clientInfo.ip,\r\n timezone: clientInfo.timezone,\r\n agent: clientInfo.agent,\r\n cookie,\r\n };\r\n\r\n const response = await api.apps.post<SessionKeepResponse>(\r\n \"/auth/keep\",\r\n payload,\r\n requestConfig,\r\n );\r\n\r\n return response.status === 1;\r\n } catch (error) {\r\n console.error(\"[AuthService] validateSession error\", error);\r\n return false;\r\n }\r\n }\r\n\r\n async isAuthenticated(): Promise<boolean> {\r\n const token = await this.getToken();\r\n return !!token;\r\n }\r\n\r\n async getToken(): Promise<string | undefined> {\r\n if (process.env.DUMMY_AUTH_TOKEN) return process.env.DUMMY_AUTH_TOKEN;\r\n const cookieStore = await cookies();\r\n return cookieStore.get(AUTH_COOKIE_NAME)?.value;\r\n }\r\n\r\n private async resolvePlanId(idPlan?: number | string | null): Promise<number> {\r\n if (idPlan == null || idPlan === \"\") return -1;\r\n if (typeof idPlan === \"number\" || Number(idPlan)) return Number(idPlan);\r\n\r\n if (typeof idPlan === \"string\") {\r\n const response = await api.apps.get<SearchPlansApiResponse>(\r\n `/plans?search=${encodeURIComponent(idPlan)}`,\r\n );\r\n\r\n if (response.status === 1 && response.data?.length) {\r\n return response.data[0].id;\r\n }\r\n\r\n throw new ApiError(\r\n `Plano \"${idPlan}\" não encontrado`,\r\n \"PLAN_NOT_FOUND\",\r\n 404,\r\n );\r\n }\r\n return -1;\r\n }\r\n\r\n private async setAuthCookie(token: string): Promise<void> {\r\n const cookieStore = await cookies();\r\n const whitelabel = await findWhitelabel().catch(() => null);\r\n const cookieDomain =\r\n this.normalizeCookieDomain(whitelabel?.domain);\r\n\r\n cookieStore.set(AUTH_COOKIE_NAME, token, {\r\n ...COOKIE_OPTIONS,\r\n ...(cookieDomain ? { domain: cookieDomain } : {}),\r\n maxAge: COOKIE_MAX_AGE,\r\n });\r\n }\r\n\r\n async removeAuthCookie(): Promise<void> {\r\n const cookieStore = await cookies();\r\n const whitelabel = await findWhitelabel().catch(() => null);\r\n const cookieDomain =\r\n this.normalizeCookieDomain(whitelabel?.domain);\r\n\r\n cookieStore.delete({\r\n name: AUTH_COOKIE_NAME,\r\n ...COOKIE_OPTIONS,\r\n ...(cookieDomain ? { domain: cookieDomain } : {}),\r\n });\r\n }\r\n\r\n private normalizeCookieDomain(domain?: string | null): string | undefined {\r\n if (!domain) return undefined;\r\n\r\n const normalized = domain.trim();\r\n if (!normalized) return undefined;\r\n\r\n const rawHost = (() => {\r\n try {\r\n return new URL(normalized).hostname;\r\n } catch {\r\n return normalized\r\n .replace(/^https?:\\/\\//i, \"\")\r\n .replace(/^www\\./i, \"\")\r\n .split(\"/\")[0]\r\n .split(\":\")[0];\r\n }\r\n })();\r\n\r\n if (!rawHost || rawHost === \"localhost\") {\r\n return undefined;\r\n }\r\n\r\n return rawHost.startsWith(\".\") ? rawHost : `.${rawHost}`;\r\n }\r\n}\r\n\r\nexport const authService = new AuthService();\r\n\r\nexport type { ClientInfo, GeoLocation };\r\n"],"mappings":"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","names":[]}
|
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
import "server-only";
|
|
2
|
+
import { parseNumericFields } from "../../../infra/route/parse-numeric";
|
|
2
3
|
import { safeRouteHandler } from "../../../infra/route/safe-route-handler";
|
|
3
4
|
import { searchParamsToParams } from "../../../infra/route/search-params";
|
|
4
5
|
import { projectUsersService } from "../services/project-users.service";
|
|
6
|
+
const NUMERIC_FIELDS = ["page", "limit"];
|
|
5
7
|
function createListAllAccountUsersHandler() {
|
|
6
8
|
return async function GET(req) {
|
|
7
9
|
return safeRouteHandler(
|
|
8
10
|
() => projectUsersService.listAllAccountUsers(
|
|
9
|
-
|
|
11
|
+
parseNumericFields(
|
|
12
|
+
searchParamsToParams(req.nextUrl.searchParams),
|
|
13
|
+
NUMERIC_FIELDS
|
|
14
|
+
)
|
|
10
15
|
)
|
|
11
16
|
);
|
|
12
17
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/projects/handlers/list-all-account-users.handler.ts"],"sourcesContent":["import 'server-only';\n\nimport type { NextRequest } from 'next/server';\nimport { safeRouteHandler } from '../../../infra/route/safe-route-handler';\nimport { searchParamsToParams } from '../../../infra/route/search-params';\nimport { projectUsersService } from '../services/project-users.service';\nimport type { ListUsersParams } from '../types';\n\nexport function createListAllAccountUsersHandler() {\n return async function GET(req: NextRequest) {\n return safeRouteHandler(() =>\n projectUsersService.listAllAccountUsers(\n searchParamsToParams<ListUsersParams>(req.nextUrl.searchParams)\n )\n );\n };\n}\n"],"mappings":"AAAA,OAAO;AAGP,SAAS,wBAAwB;AACjC,SAAS,4BAA4B;AACrC,SAAS,2BAA2B;
|
|
1
|
+
{"version":3,"sources":["../../../../src/modules/projects/handlers/list-all-account-users.handler.ts"],"sourcesContent":["import 'server-only';\n\nimport type { NextRequest } from 'next/server';\nimport { parseNumericFields } from '../../../infra/route/parse-numeric';\nimport { safeRouteHandler } from '../../../infra/route/safe-route-handler';\nimport { searchParamsToParams } from '../../../infra/route/search-params';\nimport { projectUsersService } from '../services/project-users.service';\nimport type { ListUsersParams } from '../types';\n\nconst NUMERIC_FIELDS = ['page', 'limit'] as const;\n\nexport function createListAllAccountUsersHandler() {\n return async function GET(req: NextRequest) {\n return safeRouteHandler(() =>\n projectUsersService.listAllAccountUsers(\n parseNumericFields<ListUsersParams>(\n searchParamsToParams<ListUsersParams>(req.nextUrl.searchParams),\n NUMERIC_FIELDS\n )\n )\n );\n };\n}\n"],"mappings":"AAAA,OAAO;AAGP,SAAS,0BAA0B;AACnC,SAAS,wBAAwB;AACjC,SAAS,4BAA4B;AACrC,SAAS,2BAA2B;AAGpC,MAAM,iBAAiB,CAAC,QAAQ,OAAO;AAEhC,SAAS,mCAAmC;AACjD,SAAO,eAAe,IAAI,KAAkB;AAC1C,WAAO;AAAA,MAAiB,MACtB,oBAAoB;AAAA,QAClB;AAAA,UACE,qBAAsC,IAAI,QAAQ,YAAY;AAAA,UAC9D;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
|
|
@@ -1,15 +1,20 @@
|
|
|
1
1
|
import "server-only";
|
|
2
2
|
import { parseId } from "../../../infra/route/parse-id";
|
|
3
|
+
import { parseNumericFields } from "../../../infra/route/parse-numeric";
|
|
3
4
|
import { safeRouteHandler } from "../../../infra/route/safe-route-handler";
|
|
4
5
|
import { searchParamsToParams } from "../../../infra/route/search-params";
|
|
5
6
|
import { projectUsersService } from "../services/project-users.service";
|
|
7
|
+
const NUMERIC_FIELDS = ["page", "limit"];
|
|
6
8
|
function createListAvailableUsersHandler() {
|
|
7
9
|
return async function GET(req, { params }) {
|
|
8
10
|
return safeRouteHandler(async () => {
|
|
9
11
|
const { id } = await params;
|
|
10
12
|
return projectUsersService.listNotInProject(
|
|
11
13
|
parseId(id),
|
|
12
|
-
|
|
14
|
+
parseNumericFields(
|
|
15
|
+
searchParamsToParams(req.nextUrl.searchParams),
|
|
16
|
+
NUMERIC_FIELDS
|
|
17
|
+
)
|
|
13
18
|
);
|
|
14
19
|
});
|
|
15
20
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/projects/handlers/list-available-users.handler.ts"],"sourcesContent":["import 'server-only';\n\nimport type { NextRequest } from 'next/server';\nimport { parseId } from '../../../infra/route/parse-id';\nimport { safeRouteHandler } from '../../../infra/route/safe-route-handler';\nimport { searchParamsToParams } from '../../../infra/route/search-params';\nimport { projectUsersService } from '../services/project-users.service';\nimport type { ListUsersParams } from '../types';\n\nexport function createListAvailableUsersHandler() {\n return async function GET(req: NextRequest, { params }: { params: Promise<{ id: string }> }) {\n return safeRouteHandler(async () => {\n const { id } = await params;\n return projectUsersService.listNotInProject(\n parseId(id),\n searchParamsToParams<ListUsersParams>(req.nextUrl.searchParams)\n );\n });\n };\n}\n"],"mappings":"AAAA,OAAO;AAGP,SAAS,eAAe;AACxB,SAAS,wBAAwB;AACjC,SAAS,4BAA4B;AACrC,SAAS,2BAA2B;
|
|
1
|
+
{"version":3,"sources":["../../../../src/modules/projects/handlers/list-available-users.handler.ts"],"sourcesContent":["import 'server-only';\n\nimport type { NextRequest } from 'next/server';\nimport { parseId } from '../../../infra/route/parse-id';\nimport { parseNumericFields } from '../../../infra/route/parse-numeric';\nimport { safeRouteHandler } from '../../../infra/route/safe-route-handler';\nimport { searchParamsToParams } from '../../../infra/route/search-params';\nimport { projectUsersService } from '../services/project-users.service';\nimport type { ListUsersParams } from '../types';\n\nconst NUMERIC_FIELDS = ['page', 'limit'] as const;\n\nexport function createListAvailableUsersHandler() {\n return async function GET(req: NextRequest, { params }: { params: Promise<{ id: string }> }) {\n return safeRouteHandler(async () => {\n const { id } = await params;\n return projectUsersService.listNotInProject(\n parseId(id),\n parseNumericFields<ListUsersParams>(\n searchParamsToParams<ListUsersParams>(req.nextUrl.searchParams),\n NUMERIC_FIELDS\n )\n );\n });\n };\n}\n"],"mappings":"AAAA,OAAO;AAGP,SAAS,eAAe;AACxB,SAAS,0BAA0B;AACnC,SAAS,wBAAwB;AACjC,SAAS,4BAA4B;AACrC,SAAS,2BAA2B;AAGpC,MAAM,iBAAiB,CAAC,QAAQ,OAAO;AAEhC,SAAS,kCAAkC;AAChD,SAAO,eAAe,IAAI,KAAkB,EAAE,OAAO,GAAwC;AAC3F,WAAO,iBAAiB,YAAY;AAClC,YAAM,EAAE,GAAG,IAAI,MAAM;AACrB,aAAO,oBAAoB;AAAA,QACzB,QAAQ,EAAE;AAAA,QACV;AAAA,UACE,qBAAsC,IAAI,QAAQ,YAAY;AAAA,UAC9D;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;","names":[]}
|
|
@@ -1,15 +1,20 @@
|
|
|
1
1
|
import "server-only";
|
|
2
2
|
import { parseId } from "../../../infra/route/parse-id";
|
|
3
|
+
import { parseNumericFields } from "../../../infra/route/parse-numeric";
|
|
3
4
|
import { safeRouteHandler } from "../../../infra/route/safe-route-handler";
|
|
4
5
|
import { searchParamsToParams } from "../../../infra/route/search-params";
|
|
5
6
|
import { projectUsersService } from "../services/project-users.service";
|
|
7
|
+
const NUMERIC_FIELDS = ["page", "limit"];
|
|
6
8
|
function createListProjectUsersHandler() {
|
|
7
9
|
return async function GET(req, { params }) {
|
|
8
10
|
return safeRouteHandler(async () => {
|
|
9
11
|
const { id } = await params;
|
|
10
12
|
return projectUsersService.listInProject(
|
|
11
13
|
parseId(id),
|
|
12
|
-
|
|
14
|
+
parseNumericFields(
|
|
15
|
+
searchParamsToParams(req.nextUrl.searchParams),
|
|
16
|
+
NUMERIC_FIELDS
|
|
17
|
+
)
|
|
13
18
|
);
|
|
14
19
|
});
|
|
15
20
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/projects/handlers/list-project-users.handler.ts"],"sourcesContent":["import 'server-only';\n\nimport type { NextRequest } from 'next/server';\nimport { parseId } from '../../../infra/route/parse-id';\nimport { safeRouteHandler } from '../../../infra/route/safe-route-handler';\nimport { searchParamsToParams } from '../../../infra/route/search-params';\nimport { projectUsersService } from '../services/project-users.service';\nimport type { ListUsersParams } from '../types';\n\nexport function createListProjectUsersHandler() {\n return async function GET(req: NextRequest, { params }: { params: Promise<{ id: string }> }) {\n return safeRouteHandler(async () => {\n const { id } = await params;\n return projectUsersService.listInProject(\n parseId(id),\n searchParamsToParams<ListUsersParams>(req.nextUrl.searchParams)\n );\n });\n };\n}\n"],"mappings":"AAAA,OAAO;AAGP,SAAS,eAAe;AACxB,SAAS,wBAAwB;AACjC,SAAS,4BAA4B;AACrC,SAAS,2BAA2B;
|
|
1
|
+
{"version":3,"sources":["../../../../src/modules/projects/handlers/list-project-users.handler.ts"],"sourcesContent":["import 'server-only';\n\nimport type { NextRequest } from 'next/server';\nimport { parseId } from '../../../infra/route/parse-id';\nimport { parseNumericFields } from '../../../infra/route/parse-numeric';\nimport { safeRouteHandler } from '../../../infra/route/safe-route-handler';\nimport { searchParamsToParams } from '../../../infra/route/search-params';\nimport { projectUsersService } from '../services/project-users.service';\nimport type { ListUsersParams } from '../types';\n\nconst NUMERIC_FIELDS = ['page', 'limit'] as const;\n\nexport function createListProjectUsersHandler() {\n return async function GET(req: NextRequest, { params }: { params: Promise<{ id: string }> }) {\n return safeRouteHandler(async () => {\n const { id } = await params;\n return projectUsersService.listInProject(\n parseId(id),\n parseNumericFields<ListUsersParams>(\n searchParamsToParams<ListUsersParams>(req.nextUrl.searchParams),\n NUMERIC_FIELDS\n )\n );\n });\n };\n}\n"],"mappings":"AAAA,OAAO;AAGP,SAAS,eAAe;AACxB,SAAS,0BAA0B;AACnC,SAAS,wBAAwB;AACjC,SAAS,4BAA4B;AACrC,SAAS,2BAA2B;AAGpC,MAAM,iBAAiB,CAAC,QAAQ,OAAO;AAEhC,SAAS,gCAAgC;AAC9C,SAAO,eAAe,IAAI,KAAkB,EAAE,OAAO,GAAwC;AAC3F,WAAO,iBAAiB,YAAY;AAClC,YAAM,EAAE,GAAG,IAAI,MAAM;AACrB,aAAO,oBAAoB;AAAA,QACzB,QAAQ,EAAE;AAAA,QACV;AAAA,UACE,qBAAsC,IAAI,QAAQ,YAAY;AAAA,UAC9D;AAAA,QACF;AAAA,MACF;AAAA,IACF,CAAC;AAAA,EACH;AACF;","names":[]}
|
|
@@ -1,12 +1,17 @@
|
|
|
1
1
|
import "server-only";
|
|
2
|
+
import { parseNumericFields } from "../../../infra/route/parse-numeric";
|
|
2
3
|
import { safeRouteHandler } from "../../../infra/route/safe-route-handler";
|
|
3
4
|
import { searchParamsToParams } from "../../../infra/route/search-params";
|
|
4
5
|
import { projectsService } from "../services/projects.service";
|
|
6
|
+
const NUMERIC_FIELDS = ["page", "limit", "deleted"];
|
|
5
7
|
function createListProjectsHandler() {
|
|
6
8
|
return async function GET(req) {
|
|
7
9
|
return safeRouteHandler(
|
|
8
10
|
() => projectsService.list(
|
|
9
|
-
|
|
11
|
+
parseNumericFields(
|
|
12
|
+
searchParamsToParams(req.nextUrl.searchParams),
|
|
13
|
+
NUMERIC_FIELDS
|
|
14
|
+
)
|
|
10
15
|
)
|
|
11
16
|
);
|
|
12
17
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/projects/handlers/list-projects.handler.ts"],"sourcesContent":["import 'server-only';\n\nimport type { NextRequest } from 'next/server';\nimport { safeRouteHandler } from '../../../infra/route/safe-route-handler';\nimport { searchParamsToParams } from '../../../infra/route/search-params';\nimport { projectsService } from '../services/projects.service';\nimport type { ListProjectsActionParams } from '../actions/list-projects.action';\n\nexport function createListProjectsHandler() {\n return async function GET(req: NextRequest) {\n return safeRouteHandler(() =>\n projectsService.list(\n searchParamsToParams<ListProjectsActionParams>(req.nextUrl.searchParams)\n )\n );\n };\n}\n"],"mappings":"AAAA,OAAO;AAGP,SAAS,wBAAwB;AACjC,SAAS,4BAA4B;AACrC,SAAS,uBAAuB;
|
|
1
|
+
{"version":3,"sources":["../../../../src/modules/projects/handlers/list-projects.handler.ts"],"sourcesContent":["import 'server-only';\n\nimport type { NextRequest } from 'next/server';\nimport { parseNumericFields } from '../../../infra/route/parse-numeric';\nimport { safeRouteHandler } from '../../../infra/route/safe-route-handler';\nimport { searchParamsToParams } from '../../../infra/route/search-params';\nimport { projectsService } from '../services/projects.service';\nimport type { ListProjectsActionParams } from '../actions/list-projects.action';\n\nconst NUMERIC_FIELDS = ['page', 'limit', 'deleted'] as const;\n\nexport function createListProjectsHandler() {\n return async function GET(req: NextRequest) {\n return safeRouteHandler(() =>\n projectsService.list(\n parseNumericFields<ListProjectsActionParams>(\n searchParamsToParams<ListProjectsActionParams>(req.nextUrl.searchParams),\n NUMERIC_FIELDS\n )\n )\n );\n };\n}\n"],"mappings":"AAAA,OAAO;AAGP,SAAS,0BAA0B;AACnC,SAAS,wBAAwB;AACjC,SAAS,4BAA4B;AACrC,SAAS,uBAAuB;AAGhC,MAAM,iBAAiB,CAAC,QAAQ,SAAS,SAAS;AAE3C,SAAS,4BAA4B;AAC1C,SAAO,eAAe,IAAI,KAAkB;AAC1C,WAAO;AAAA,MAAiB,MACtB,gBAAgB;AAAA,QACd;AAAA,UACE,qBAA+C,IAAI,QAAQ,YAAY;AAAA,UACvE;AAAA,QACF;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/users/hooks/messages.hook.ts"],"sourcesContent":["'use client';\n\nimport { useInfiniteQuery, useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from '../../../infra/http/api-fetch';\nimport { markMessageAsReadAction } from '../action/mark-message-as-read.action';\nimport { markAllMessagesAsReadAction } from '../action/mark-all-messages-as-read.action';\nimport { withAction } from '../../../utils/withAction';\nimport type { FindMessagesParams,
|
|
1
|
+
{"version":3,"sources":["../../../../src/modules/users/hooks/messages.hook.ts"],"sourcesContent":["'use client';\n\nimport { useInfiniteQuery, useMutation, useQuery, useQueryClient } from '@tanstack/react-query';\nimport { apiFetch } from '../../../infra/http/api-fetch';\nimport { markMessageAsReadAction } from '../action/mark-message-as-read.action';\nimport { markAllMessagesAsReadAction } from '../action/mark-all-messages-as-read.action';\nimport { withAction } from '../../../utils/withAction';\nimport type { FindMessagesParams, ListMessagesResult } from '../schema/messages.schema';\nimport { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';\n\nexport const MESSAGES_QUERY_KEY = ['messages'] as const;\n\nconst INFINITE_MESSAGES_PAGE_SIZE = 10;\n\nexport function useMessages(params?: Partial<FindMessagesParams>) {\n const queryKey = useAuthQueryKey([...MESSAGES_QUERY_KEY, params]);\n\n return useQuery({\n queryKey,\n queryFn: ({ signal }) =>\n apiFetch<ListMessagesResult>('/api/messages', { params, signal }),\n });\n}\n\nexport function useInfiniteMessages(params?: Partial<Omit<FindMessagesParams, 'page' | 'limit'>>) {\n const queryKey = useAuthQueryKey([...MESSAGES_QUERY_KEY, 'infinite', params]);\n\n return useInfiniteQuery({\n queryKey,\n queryFn: ({ pageParam, signal }) =>\n apiFetch<ListMessagesResult>('/api/messages', {\n params: {\n ...params,\n page: pageParam as number,\n limit: INFINITE_MESSAGES_PAGE_SIZE,\n },\n signal,\n }),\n getNextPageParam: (lastPage, allPages) => {\n const loaded = allPages.reduce((sum, p) => sum + p.data.length, 0);\n return loaded < lastPage.total ? allPages.length + 1 : undefined;\n },\n initialPageParam: 1,\n });\n}\n\nexport function useMarkMessageAsRead() {\n const queryClient = useQueryClient();\n const messagesKey = useAuthQueryKey([...MESSAGES_QUERY_KEY]);\n\n return useMutation({\n mutationFn: withAction(markMessageAsReadAction),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: messagesKey });\n },\n });\n}\n\nexport function useMarkAllMessagesAsRead() {\n const queryClient = useQueryClient();\n const messagesKey = useAuthQueryKey([...MESSAGES_QUERY_KEY]);\n\n return useMutation({\n mutationFn: withAction(markAllMessagesAsReadAction),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: messagesKey });\n },\n });\n}\n"],"mappings":";AAEA,SAAS,kBAAkB,aAAa,UAAU,sBAAsB;AACxE,SAAS,gBAAgB;AACzB,SAAS,+BAA+B;AACxC,SAAS,mCAAmC;AAC5C,SAAS,kBAAkB;AAE3B,SAAS,uBAAuB;AAEzB,MAAM,qBAAqB,CAAC,UAAU;AAE7C,MAAM,8BAA8B;AAE7B,SAAS,YAAY,QAAsC;AAChE,QAAM,WAAW,gBAAgB,CAAC,GAAG,oBAAoB,MAAM,CAAC;AAEhE,SAAO,SAAS;AAAA,IACd;AAAA,IACA,SAAS,CAAC,EAAE,OAAO,MACjB,SAA6B,iBAAiB,EAAE,QAAQ,OAAO,CAAC;AAAA,EACpE,CAAC;AACH;AAEO,SAAS,oBAAoB,QAA8D;AAChG,QAAM,WAAW,gBAAgB,CAAC,GAAG,oBAAoB,YAAY,MAAM,CAAC;AAE5E,SAAO,iBAAiB;AAAA,IACtB;AAAA,IACA,SAAS,CAAC,EAAE,WAAW,OAAO,MAC5B,SAA6B,iBAAiB;AAAA,MAC5C,QAAQ;AAAA,QACN,GAAG;AAAA,QACH,MAAM;AAAA,QACN,OAAO;AAAA,MACT;AAAA,MACA;AAAA,IACF,CAAC;AAAA,IACH,kBAAkB,CAAC,UAAU,aAAa;AACxC,YAAM,SAAS,SAAS,OAAO,CAAC,KAAK,MAAM,MAAM,EAAE,KAAK,QAAQ,CAAC;AACjE,aAAO,SAAS,SAAS,QAAQ,SAAS,SAAS,IAAI;AAAA,IACzD;AAAA,IACA,kBAAkB;AAAA,EACpB,CAAC;AACH;AAEO,SAAS,uBAAuB;AACrC,QAAM,cAAc,eAAe;AACnC,QAAM,cAAc,gBAAgB,CAAC,GAAG,kBAAkB,CAAC;AAE3D,SAAO,YAAY;AAAA,IACjB,YAAY,WAAW,uBAAuB;AAAA,IAC9C,WAAW,MAAM;AACf,kBAAY,kBAAkB,EAAE,UAAU,YAAY,CAAC;AAAA,IACzD;AAAA,EACF,CAAC;AACH;AAEO,SAAS,2BAA2B;AACzC,QAAM,cAAc,eAAe;AACnC,QAAM,cAAc,gBAAgB,CAAC,GAAG,kBAAkB,CAAC;AAE3D,SAAO,YAAY;AAAA,IACjB,YAAY,WAAW,2BAA2B;AAAA,IAClD,WAAW,MAAM;AACf,kBAAY,kBAAkB,EAAE,UAAU,YAAY,CAAC;AAAA,IACzD;AAAA,EACF,CAAC;AACH;","names":[]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/users/schema/messages.schema.ts"],"sourcesContent":["import { z } from 'zod';\r\n\r\nexport const MessageSchema = z.object({\r\n id: z.string(),\r\n deleted: z.number(),\r\n datetime_alt: z.string().nullable(),\r\n datetime_del: z.string().nullable(),\r\n datetime_add: z.string(),\r\n id_wl: z.number(),\r\n id_account: z.number(),\r\n id_user: z.number(),\r\n status: z.number().nullable(),\r\n type: z.string(),\r\n subject: z.string(),\r\n message: z.string(),\r\n to: z.string(),\r\n url: z.string(),\r\n});\r\n\r\nexport type Message = z.infer<typeof MessageSchema>;\r\n\r\nexport interface FindMessagesParams {\r\n id_user: number;\r\n type: string;\r\n limit: number;\r\n page: number;\r\n status: number;\r\n readed: boolean;\r\n order: 'asc' | 'desc';\r\n}\r\n\r\nexport interface ListMessagesApiResponse {\r\n status: 0 | 1;\r\n total: number;\r\n data: Message[];\r\n totalUnread: number;\r\n message?: string;\r\n}\r\n\r\nexport interface MarkAsReadApiResponse {\r\n status: 0 | 1;\r\n message?: string;\r\n}\r\n\r\nexport interface MarkAllAsReadApiResponse {\r\n status: 0 | 1;\r\n message?: string;\r\n}\r\n"],"mappings":"AAAA,SAAS,SAAS;AAEX,MAAM,gBAAgB,EAAE,OAAO;AAAA,EACpC,IAAI,EAAE,OAAO;AAAA,EACb,SAAS,EAAE,OAAO;AAAA,EAClB,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,EAClC,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,EAClC,cAAc,EAAE,OAAO;AAAA,EACvB,OAAO,EAAE,OAAO;AAAA,EAChB,YAAY,EAAE,OAAO;AAAA,EACrB,SAAS,EAAE,OAAO;AAAA,EAClB,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,MAAM,EAAE,OAAO;AAAA,EACf,SAAS,EAAE,OAAO;AAAA,EAClB,SAAS,EAAE,OAAO;AAAA,EAClB,IAAI,EAAE,OAAO;AAAA,EACb,KAAK,EAAE,OAAO;AAChB,CAAC;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../../../../src/modules/users/schema/messages.schema.ts"],"sourcesContent":["import { z } from 'zod';\r\n\r\nexport const MessageSchema = z.object({\r\n id: z.string(),\r\n deleted: z.number(),\r\n datetime_alt: z.string().nullable(),\r\n datetime_del: z.string().nullable(),\r\n datetime_add: z.string(),\r\n id_wl: z.number(),\r\n id_account: z.number(),\r\n id_user: z.number(),\r\n status: z.number().nullable(),\r\n type: z.string(),\r\n subject: z.string(),\r\n message: z.string(),\r\n to: z.string(),\r\n url: z.string(),\r\n});\r\n\r\nexport type Message = z.infer<typeof MessageSchema>;\r\n\r\nexport interface FindMessagesParams {\r\n id_user: number;\r\n type: string;\r\n limit: number;\r\n page: number;\r\n status: number;\r\n readed: boolean;\r\n order: 'asc' | 'desc';\r\n}\r\n\r\nexport interface ListMessagesApiResponse {\r\n status: 0 | 1;\r\n total: number;\r\n data: Message[];\r\n totalUnread: number;\r\n message?: string;\r\n}\r\n\r\nexport type ListMessagesResult = Omit<ListMessagesApiResponse, 'status' | 'message'>;\r\n\r\nexport interface MarkAsReadApiResponse {\r\n status: 0 | 1;\r\n message?: string;\r\n}\r\n\r\nexport interface MarkAllAsReadApiResponse {\r\n status: 0 | 1;\r\n message?: string;\r\n}\r\n"],"mappings":"AAAA,SAAS,SAAS;AAEX,MAAM,gBAAgB,EAAE,OAAO;AAAA,EACpC,IAAI,EAAE,OAAO;AAAA,EACb,SAAS,EAAE,OAAO;AAAA,EAClB,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,EAClC,cAAc,EAAE,OAAO,EAAE,SAAS;AAAA,EAClC,cAAc,EAAE,OAAO;AAAA,EACvB,OAAO,EAAE,OAAO;AAAA,EAChB,YAAY,EAAE,OAAO;AAAA,EACrB,SAAS,EAAE,OAAO;AAAA,EAClB,QAAQ,EAAE,OAAO,EAAE,SAAS;AAAA,EAC5B,MAAM,EAAE,OAAO;AAAA,EACf,SAAS,EAAE,OAAO;AAAA,EAClB,SAAS,EAAE,OAAO;AAAA,EAClB,IAAI,EAAE,OAAO;AAAA,EACb,KAAK,EAAE,OAAO;AAChB,CAAC;","names":[]}
|
package/dist/route.mjs
CHANGED
|
@@ -1,8 +1,10 @@
|
|
|
1
1
|
import { safeRouteHandler } from "./infra/route/safe-route-handler";
|
|
2
2
|
import { searchParamsToParams } from "./infra/route/search-params";
|
|
3
3
|
import { parseId } from "./infra/route/parse-id";
|
|
4
|
+
import { parseNumericFields } from "./infra/route/parse-numeric";
|
|
4
5
|
export {
|
|
5
6
|
parseId,
|
|
7
|
+
parseNumericFields,
|
|
6
8
|
safeRouteHandler,
|
|
7
9
|
searchParamsToParams
|
|
8
10
|
};
|
package/dist/route.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/route.ts"],"sourcesContent":["export { safeRouteHandler } from './infra/route/safe-route-handler';\nexport { searchParamsToParams } from './infra/route/search-params';\nexport { parseId } from './infra/route/parse-id';\n"],"mappings":"AAAA,SAAS,wBAAwB;AACjC,SAAS,4BAA4B;AACrC,SAAS,eAAe;","names":[]}
|
|
1
|
+
{"version":3,"sources":["../src/route.ts"],"sourcesContent":["export { safeRouteHandler } from './infra/route/safe-route-handler';\nexport { searchParamsToParams } from './infra/route/search-params';\nexport { parseId } from './infra/route/parse-id';\nexport { parseNumericFields } from './infra/route/parse-numeric';\n"],"mappings":"AAAA,SAAS,wBAAwB;AACjC,SAAS,4BAA4B;AACrC,SAAS,eAAe;AACxB,SAAS,0BAA0B;","names":[]}
|
package/dist/server.mjs
CHANGED
|
@@ -21,21 +21,14 @@ import { findUserById } from "./modules/users/action/find-user-by-id.action";
|
|
|
21
21
|
import { findCurrentAccount } from "./modules/accounts/actions/find-current-account.action";
|
|
22
22
|
import { getAccountTokenAction } from "./modules/accounts/actions/get-account-token.action";
|
|
23
23
|
import { listSubscriptionsAction } from "./modules/subscriptions/actions/list-subscriptions.action";
|
|
24
|
-
import { findPlanByIdAction } from "./modules/plans/actions/find-plan-by-id.action";
|
|
25
|
-
import { listPlansAction } from "./modules/plans/actions/list-plans.action";
|
|
26
24
|
import { calculateSubscriptionAction } from "./modules/subscriptions/actions/calculate-subscription.action";
|
|
27
25
|
import { updateSubscriptionPlanAction } from "./modules/subscriptions/actions/update-subscription-plan.action";
|
|
28
26
|
import { updateSubscriptionPaymentAction } from "./modules/subscriptions/actions/update-subscription-payment.action";
|
|
29
|
-
import { listCardsAction } from "./modules/cards/actions/list-cards.action";
|
|
30
27
|
import { createCardAction } from "./modules/cards/actions/create-card.action";
|
|
31
28
|
import { createSetupIntentAction } from "./modules/cards/actions/create-setup-intent.action";
|
|
32
|
-
import { listChargesAction } from "./modules/charges/actions/list-charges.action";
|
|
33
|
-
import { findChargeByIdAction } from "./modules/charges/actions/find-charge-by-id.action";
|
|
34
29
|
import { chargeActionAction } from "./modules/charges/actions/charge-action.action";
|
|
35
30
|
import { resolvePlanExtrasPrices } from "./modules/subscriptions/utils/resolve-plan-extras-prices";
|
|
36
31
|
import { hasSubscriptionExpired } from "./modules/subscriptions/utils/has-subscription-expired";
|
|
37
|
-
import { listIaCreditsAction } from "./modules/ia-credits/actions/list-ia-credits.action";
|
|
38
|
-
import { countPagesAction } from "./modules/pages/actions/count-pages.action";
|
|
39
32
|
import { projectsService } from "./modules/projects/services/projects.service";
|
|
40
33
|
import { listProjectsAction } from "./modules/projects/actions/list-projects.action";
|
|
41
34
|
import { findProjectAction } from "./modules/projects/actions/find-project.action";
|
|
@@ -44,7 +37,6 @@ import { updateProjectAction } from "./modules/projects/actions/update-project.a
|
|
|
44
37
|
import { deleteProjectAction } from "./modules/projects/actions/delete-project.action";
|
|
45
38
|
import { projectUsersService } from "./modules/projects/services/project-users.service";
|
|
46
39
|
import { listProjectUsersAction } from "./modules/projects/actions/list-project-users.action";
|
|
47
|
-
import { listAvailableUsersAction } from "./modules/projects/actions/list-available-users.action";
|
|
48
40
|
import { addProjectUserAction } from "./modules/projects/actions/add-project-user.action";
|
|
49
41
|
import { removeProjectUserAction } from "./modules/projects/actions/remove-project-user.action";
|
|
50
42
|
import { accountService } from "./modules/accounts/services/account.service";
|
|
@@ -96,7 +88,6 @@ export {
|
|
|
96
88
|
confirmEmailChangeAction,
|
|
97
89
|
confirmPhoneChangeAction,
|
|
98
90
|
confirmTwoFactorAction,
|
|
99
|
-
countPagesAction,
|
|
100
91
|
createAccountUserAction,
|
|
101
92
|
createCardAction,
|
|
102
93
|
createProjectAction,
|
|
@@ -105,9 +96,7 @@ export {
|
|
|
105
96
|
deleteAccountUserAction,
|
|
106
97
|
deleteProjectAction,
|
|
107
98
|
disableTwoFactorAction,
|
|
108
|
-
findChargeByIdAction,
|
|
109
99
|
findCurrentAccount,
|
|
110
|
-
findPlanByIdAction,
|
|
111
100
|
findProjectAction,
|
|
112
101
|
findUserById,
|
|
113
102
|
findWhitelabel,
|
|
@@ -118,11 +107,6 @@ export {
|
|
|
118
107
|
hasSubscriptionExpired,
|
|
119
108
|
iaCreditsService,
|
|
120
109
|
listAccountUsersAction,
|
|
121
|
-
listAvailableUsersAction,
|
|
122
|
-
listCardsAction,
|
|
123
|
-
listChargesAction,
|
|
124
|
-
listIaCreditsAction,
|
|
125
|
-
listPlansAction,
|
|
126
110
|
listProjectUsersAction,
|
|
127
111
|
listProjectsAction,
|
|
128
112
|
listSubscriptionsAction,
|
package/dist/server.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/server.ts"],"sourcesContent":["import 'server-only';\r\n\r\n// API Client\r\nexport { ApiClient, api, apiClient } from './infra/api/client';\r\n\r\n// Services\r\nexport { authService } from './modules/auth/services/auth.service';\r\nexport { whitelabelService } from './modules/whitelabel/services/whitelabel.service';\r\nexport { revalidateWhitelabelAction } from './modules/whitelabel/actions/revalidate-whitelabel.action';\r\nexport { assertManagementPermission } from './modules/auth/utils/assert-management-permission';\r\nexport { assertManagementSubscription } from './modules/auth/utils/assert-management-subscription';\r\nexport { assertSubscriptionAddon } from './modules/auth/utils/assert-subscription-addon';\r\nexport { assertPaidSubscription } from './modules/auth/utils/assert-paid-subscription';\r\nexport { subscriptionsService } from './modules/subscriptions/services/subscriptions.service';\r\nexport { plansService } from './modules/plans/services/plans.service';\r\nexport { cardsService } from './modules/cards/services/cards.service';\r\nexport { chargesService } from './modules/charges/services/charges.service';\r\nexport { iaCreditsService } from './modules/ia-credits/services/ia-credits.service';\r\n\r\n// Actions\r\nexport { findWhitelabel } from './modules/whitelabel/actions/find-whitelabel.action';\r\nexport { validateSessionAction } from './modules/auth/actions/validate-session.action';\r\nexport { socialGoogleLoginAction } from './modules/auth/actions/social-google-login.action';\r\nexport { socialGoogleOnboardingAction } from './modules/auth/actions/social-google-onboarding.action';\r\nexport { unlinkGoogleAction } from './modules/auth/actions/unlink-google.action';\r\nexport { findUserById } from './modules/users/action/find-user-by-id.action';\r\nexport { findCurrentAccount } from './modules/accounts/actions/find-current-account.action';\r\nexport { getAccountTokenAction } from './modules/accounts/actions/get-account-token.action';\r\nexport { listSubscriptionsAction } from './modules/subscriptions/actions/list-subscriptions.action';\r\nexport {
|
|
1
|
+
{"version":3,"sources":["../src/server.ts"],"sourcesContent":["import 'server-only';\r\n\r\n// API Client\r\nexport { ApiClient, api, apiClient } from './infra/api/client';\r\n\r\n// Services\r\nexport { authService } from './modules/auth/services/auth.service';\r\nexport { whitelabelService } from './modules/whitelabel/services/whitelabel.service';\r\nexport { revalidateWhitelabelAction } from './modules/whitelabel/actions/revalidate-whitelabel.action';\r\nexport { assertManagementPermission } from './modules/auth/utils/assert-management-permission';\r\nexport { assertManagementSubscription } from './modules/auth/utils/assert-management-subscription';\r\nexport { assertSubscriptionAddon } from './modules/auth/utils/assert-subscription-addon';\r\nexport { assertPaidSubscription } from './modules/auth/utils/assert-paid-subscription';\r\nexport { subscriptionsService } from './modules/subscriptions/services/subscriptions.service';\r\nexport { plansService } from './modules/plans/services/plans.service';\r\nexport { cardsService } from './modules/cards/services/cards.service';\r\nexport { chargesService } from './modules/charges/services/charges.service';\r\nexport { iaCreditsService } from './modules/ia-credits/services/ia-credits.service';\r\n\r\n// Actions\r\nexport { findWhitelabel } from './modules/whitelabel/actions/find-whitelabel.action';\r\nexport { validateSessionAction } from './modules/auth/actions/validate-session.action';\r\nexport { socialGoogleLoginAction } from './modules/auth/actions/social-google-login.action';\r\nexport { socialGoogleOnboardingAction } from './modules/auth/actions/social-google-onboarding.action';\r\nexport { unlinkGoogleAction } from './modules/auth/actions/unlink-google.action';\r\nexport { findUserById } from './modules/users/action/find-user-by-id.action';\r\nexport { findCurrentAccount } from './modules/accounts/actions/find-current-account.action';\r\nexport { getAccountTokenAction } from './modules/accounts/actions/get-account-token.action';\r\nexport { listSubscriptionsAction } from './modules/subscriptions/actions/list-subscriptions.action';\r\nexport { calculateSubscriptionAction } from './modules/subscriptions/actions/calculate-subscription.action';\r\nexport { updateSubscriptionPlanAction } from './modules/subscriptions/actions/update-subscription-plan.action';\r\nexport { updateSubscriptionPaymentAction } from './modules/subscriptions/actions/update-subscription-payment.action';\r\nexport { createCardAction } from './modules/cards/actions/create-card.action';\r\nexport { createSetupIntentAction } from './modules/cards/actions/create-setup-intent.action';\r\nexport { chargeActionAction } from './modules/charges/actions/charge-action.action';\r\nexport { resolvePlanExtrasPrices } from './modules/subscriptions/utils/resolve-plan-extras-prices';\r\nexport { hasSubscriptionExpired } from './modules/subscriptions/utils/has-subscription-expired';\r\n\r\n// Project Services & Actions (server-only)\r\nexport { projectsService } from './modules/projects/services/projects.service';\r\nexport { listProjectsAction } from './modules/projects/actions/list-projects.action';\r\nexport { findProjectAction } from './modules/projects/actions/find-project.action';\r\nexport { createProjectAction } from './modules/projects/actions/create-project.action';\r\nexport { updateProjectAction } from './modules/projects/actions/update-project.action';\r\nexport { deleteProjectAction } from './modules/projects/actions/delete-project.action';\r\n\r\n// Project Users Services & Actions (server-only)\r\nexport { projectUsersService } from './modules/projects/services/project-users.service';\r\nexport { listProjectUsersAction } from './modules/projects/actions/list-project-users.action';\r\nexport { addProjectUserAction } from './modules/projects/actions/add-project-user.action';\r\nexport { removeProjectUserAction } from './modules/projects/actions/remove-project-user.action';\r\n\r\n// Account Services & Actions (server-only)\r\nexport { accountService } from './modules/accounts/services/account.service';\r\nexport { twoFactorService } from './modules/accounts/services/two-factor.service';\r\nexport {\r\n listAccountUsersAction,\r\n updateUserAction,\r\n updateAccountAction,\r\n updateAccountUserByIdAction,\r\n deleteAccountUserAction,\r\n deleteAccountAction,\r\n createAccountUserAction,\r\n changePasswordAction,\r\n requestEmailChangeAction,\r\n confirmEmailChangeAction,\r\n requestPhoneChangeAction,\r\n confirmPhoneChangeAction,\r\n generateTwoFactorAction,\r\n confirmTwoFactorAction,\r\n disableTwoFactorAction,\r\n} from './modules/accounts/actions/account-management.action';\r\n\r\n// Server Utils\r\nexport { getClientInfoFromRequest } from './infra/utils/client-info';\r\nexport { getUserContext } from './modules/auth/utils/get-user-context';\r\nexport { requireValidSession } from './modules/auth/utils/require-valid-session';\r\nexport { requireTokenNotExpired } from './modules/auth/utils/require-token-not-expired';\r\nexport { buildWlOverride, buildWlOverrideFromJwt } from './modules/auth/utils/build-wl-override';\r\nexport { safeServerAction } from './utils/safeServerAction';\r\nexport { safeMutationAction } from './utils/safeMutationAction';\r\n\r\n// Image Processing (server-side)\r\nexport { processImageAction } from './modules/images/actions/process-image.action';\r\nexport { processImage } from './modules/images/services/image-processing.service';\r\nexport type {\r\n ProcessImageInput,\r\n ProcessImageOutput,\r\n ProcessImageActionInput,\r\n ProcessImageActionOutput,\r\n} from './modules/images/types/image.type';\r\n"],"mappings":"AAAA,OAAO;AAGP,SAAS,WAAW,KAAK,iBAAiB;AAG1C,SAAS,mBAAmB;AAC5B,SAAS,yBAAyB;AAClC,SAAS,kCAAkC;AAC3C,SAAS,kCAAkC;AAC3C,SAAS,oCAAoC;AAC7C,SAAS,+BAA+B;AACxC,SAAS,8BAA8B;AACvC,SAAS,4BAA4B;AACrC,SAAS,oBAAoB;AAC7B,SAAS,oBAAoB;AAC7B,SAAS,sBAAsB;AAC/B,SAAS,wBAAwB;AAGjC,SAAS,sBAAsB;AAC/B,SAAS,6BAA6B;AACtC,SAAS,+BAA+B;AACxC,SAAS,oCAAoC;AAC7C,SAAS,0BAA0B;AACnC,SAAS,oBAAoB;AAC7B,SAAS,0BAA0B;AACnC,SAAS,6BAA6B;AACtC,SAAS,+BAA+B;AACxC,SAAS,mCAAmC;AAC5C,SAAS,oCAAoC;AAC7C,SAAS,uCAAuC;AAChD,SAAS,wBAAwB;AACjC,SAAS,+BAA+B;AACxC,SAAS,0BAA0B;AACnC,SAAS,+BAA+B;AACxC,SAAS,8BAA8B;AAGvC,SAAS,uBAAuB;AAChC,SAAS,0BAA0B;AACnC,SAAS,yBAAyB;AAClC,SAAS,2BAA2B;AACpC,SAAS,2BAA2B;AACpC,SAAS,2BAA2B;AAGpC,SAAS,2BAA2B;AACpC,SAAS,8BAA8B;AACvC,SAAS,4BAA4B;AACrC,SAAS,+BAA+B;AAGxC,SAAS,sBAAsB;AAC/B,SAAS,wBAAwB;AACjC;AAAA,EACE;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,EACA;AAAA,OACK;AAGP,SAAS,gCAAgC;AACzC,SAAS,sBAAsB;AAC/B,SAAS,2BAA2B;AACpC,SAAS,8BAA8B;AACvC,SAAS,iBAAiB,8BAA8B;AACxD,SAAS,wBAAwB;AACjC,SAAS,0BAA0B;AAGnC,SAAS,0BAA0B;AACnC,SAAS,oBAAoB;","names":[]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@greatapps/common",
|
|
3
|
-
"version": "1.1.
|
|
3
|
+
"version": "1.1.663",
|
|
4
4
|
"description": "Shared library for GreatApps frontend applications",
|
|
5
5
|
"main": "./dist/index.mjs",
|
|
6
6
|
"types": "./src/index.ts",
|
|
@@ -77,7 +77,7 @@
|
|
|
77
77
|
},
|
|
78
78
|
"devDependencies": {
|
|
79
79
|
"@hookform/resolvers": "^5.2.2",
|
|
80
|
-
"zod": "^4.3
|
|
80
|
+
"zod": "^4.4.3",
|
|
81
81
|
"@tanstack/react-query": "^5.95.2",
|
|
82
82
|
"@tanstack/react-query-devtools": "^5.95.2",
|
|
83
83
|
"@types/node": "^25.5.0",
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export function parseNumericFields<T extends object>(
|
|
2
|
+
params: Partial<T>,
|
|
3
|
+
fields: readonly (keyof T)[]
|
|
4
|
+
): Partial<T> {
|
|
5
|
+
const result: Partial<T> = { ...params };
|
|
6
|
+
for (const field of fields) {
|
|
7
|
+
const v = result[field] as unknown;
|
|
8
|
+
if (typeof v === 'string' && v !== '') {
|
|
9
|
+
const n = Number(v);
|
|
10
|
+
if (Number.isFinite(n)) {
|
|
11
|
+
result[field] = n as T[keyof T];
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
return result;
|
|
16
|
+
}
|
|
@@ -1,15 +1,19 @@
|
|
|
1
|
-
'use server';
|
|
2
|
-
|
|
3
|
-
import { safeServerAction } from '../../../utils/safeServerAction';
|
|
4
|
-
import { authService } from '../services/auth.service';
|
|
5
|
-
import { getClientInfoFromRequest } from '../../../infra/utils/client-info';
|
|
6
|
-
|
|
7
|
-
export async function verifyTwoFactorAction(
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
}
|
|
1
|
+
'use server';
|
|
2
|
+
|
|
3
|
+
import { safeServerAction } from '../../../utils/safeServerAction';
|
|
4
|
+
import { authService } from '../services/auth.service';
|
|
5
|
+
import { getClientInfoFromRequest } from '../../../infra/utils/client-info';
|
|
6
|
+
|
|
7
|
+
export async function verifyTwoFactorAction(
|
|
8
|
+
cookie: string,
|
|
9
|
+
code: string,
|
|
10
|
+
options?: { window?: number; setCookie?: boolean },
|
|
11
|
+
) {
|
|
12
|
+
return safeServerAction(async () => {
|
|
13
|
+
if (!/^\d{6}$/.test(code)) {
|
|
14
|
+
throw new Error('Formato inválido');
|
|
15
|
+
}
|
|
16
|
+
const clientInfo = await getClientInfoFromRequest();
|
|
17
|
+
return authService.verifyTwoFactor(cookie, code, clientInfo, options);
|
|
18
|
+
});
|
|
19
|
+
}
|
|
@@ -51,9 +51,25 @@ export function useTwoFactorVerify() {
|
|
|
51
51
|
const twoFactorKey = useWlQueryKey(['two-factor-pending']);
|
|
52
52
|
|
|
53
53
|
return useMutation({
|
|
54
|
-
mutationFn: async ({
|
|
54
|
+
mutationFn: async ({
|
|
55
|
+
cookie,
|
|
56
|
+
code,
|
|
57
|
+
window,
|
|
58
|
+
setCookie,
|
|
59
|
+
}: {
|
|
60
|
+
cookie: string;
|
|
61
|
+
code: string;
|
|
62
|
+
window?: number;
|
|
63
|
+
/**
|
|
64
|
+
* Quando `false`, o verify não grava o cookie de sessão e devolve o
|
|
65
|
+
* `accessToken` no resultado. Usado em fluxos como SSO em que o token
|
|
66
|
+
* vai pra outro destino (callback de app) e não pode derrubar a
|
|
67
|
+
* sessão atual do Great no navegador.
|
|
68
|
+
*/
|
|
69
|
+
setCookie?: boolean;
|
|
70
|
+
}) => {
|
|
55
71
|
const { verifyTwoFactorAction } = await import('../actions/verify-two-factor.action');
|
|
56
|
-
return withAction(() => verifyTwoFactorAction(cookie, code, window))();
|
|
72
|
+
return withAction(() => verifyTwoFactorAction(cookie, code, { window, setCookie }))();
|
|
57
73
|
},
|
|
58
74
|
onSuccess: () => {
|
|
59
75
|
queryClient.invalidateQueries({ queryKey: userKey });
|
|
@@ -30,6 +30,16 @@ export type LoginResponse =
|
|
|
30
30
|
|
|
31
31
|
export type LoginSuccessResponse = Exclude<LoginResponse, { result: 'error' }>;
|
|
32
32
|
|
|
33
|
+
/**
|
|
34
|
+
* Resultado de `authService.login` quando chamado com `{ setCookie: false }`.
|
|
35
|
+
* Não retorna user/account (não são buscados) e não seta o cookie da sessão —
|
|
36
|
+
* usado por fluxos como SSO que precisam só do token, sem afetar a sessão
|
|
37
|
+
* do navegador.
|
|
38
|
+
*/
|
|
39
|
+
export type IsolatedLoginResponse =
|
|
40
|
+
| { result: 'two_factor_required'; cookie: string; twoFactorMode: 'verify' | 'setup' }
|
|
41
|
+
| { result: 'success'; accessToken: string };
|
|
42
|
+
|
|
33
43
|
export interface TwoFactorRequest {
|
|
34
44
|
location: GeoLocation;
|
|
35
45
|
ip: string;
|
|
@@ -49,6 +59,12 @@ export interface TwoFactorApiResponse {
|
|
|
49
59
|
export interface TwoFactorResponse {
|
|
50
60
|
status: 0 | 1;
|
|
51
61
|
message?: string;
|
|
62
|
+
/**
|
|
63
|
+
* Token de sessão recém-criado. Populado apenas quando o verify foi chamado
|
|
64
|
+
* com `setCookie: false` — caso em que o cookie não é gravado e o caller
|
|
65
|
+
* precisa do token explicitamente (ex.: fluxo de SSO).
|
|
66
|
+
*/
|
|
67
|
+
accessToken?: string;
|
|
52
68
|
}
|
|
53
69
|
|
|
54
70
|
export interface GeoLocation {
|
|
@@ -31,6 +31,7 @@ import {
|
|
|
31
31
|
SocialOnboardingApiResponse,
|
|
32
32
|
SocialOnboardingRequest,
|
|
33
33
|
SocialOnboardingResponse,
|
|
34
|
+
IsolatedLoginResponse,
|
|
34
35
|
TwoFactorApiResponse,
|
|
35
36
|
TwoFactorRequest,
|
|
36
37
|
TwoFactorResponse,
|
|
@@ -55,7 +56,22 @@ class AuthService {
|
|
|
55
56
|
async login(
|
|
56
57
|
credentials: LoginRequest,
|
|
57
58
|
clientInfo: ClientInfo,
|
|
58
|
-
): Promise<LoginResponse
|
|
59
|
+
): Promise<LoginResponse>;
|
|
60
|
+
async login(
|
|
61
|
+
credentials: LoginRequest,
|
|
62
|
+
clientInfo: ClientInfo,
|
|
63
|
+
options: { setCookie: false },
|
|
64
|
+
): Promise<IsolatedLoginResponse>;
|
|
65
|
+
async login(
|
|
66
|
+
credentials: LoginRequest,
|
|
67
|
+
clientInfo: ClientInfo,
|
|
68
|
+
options?: { setCookie?: boolean },
|
|
69
|
+
): Promise<LoginResponse | IsolatedLoginResponse>;
|
|
70
|
+
async login(
|
|
71
|
+
credentials: LoginRequest,
|
|
72
|
+
clientInfo: ClientInfo,
|
|
73
|
+
options?: { setCookie?: boolean },
|
|
74
|
+
): Promise<LoginResponse | IsolatedLoginResponse> {
|
|
59
75
|
let requestConfig: RequestConfig | undefined;
|
|
60
76
|
if (credentials.id_wl) {
|
|
61
77
|
const wlToken = await whitelabelService.getTokenByWhitelabelId(
|
|
@@ -98,6 +114,12 @@ class AuthService {
|
|
|
98
114
|
return { result: "two_factor_required", cookie: response.cookie, twoFactorMode: response.two_factor_required };
|
|
99
115
|
}
|
|
100
116
|
|
|
117
|
+
// Modo isolado: caller só quer o token, sem afetar a sessão do navegador
|
|
118
|
+
// nem pagar pelas chamadas de user/account (ex.: fluxo de SSO).
|
|
119
|
+
if (options?.setCookie === false) {
|
|
120
|
+
return { result: "success", accessToken: response.cookie };
|
|
121
|
+
}
|
|
122
|
+
|
|
101
123
|
await this.setAuthCookie(response.cookie);
|
|
102
124
|
|
|
103
125
|
const [{ userService }, { accountService }] = await Promise.all([
|
|
@@ -125,7 +147,7 @@ class AuthService {
|
|
|
125
147
|
cookie: string,
|
|
126
148
|
code: string,
|
|
127
149
|
clientInfo: ClientInfo,
|
|
128
|
-
options?: { window?: number },
|
|
150
|
+
options?: { window?: number; setCookie?: boolean },
|
|
129
151
|
): Promise<TwoFactorResponse> {
|
|
130
152
|
const payload: TwoFactorRequest = {
|
|
131
153
|
location: clientInfo.location,
|
|
@@ -154,6 +176,12 @@ class AuthService {
|
|
|
154
176
|
);
|
|
155
177
|
}
|
|
156
178
|
|
|
179
|
+
// Modo isolado: devolve o token sem gravar o cookie — o caller redireciona
|
|
180
|
+
// pra outro lugar (ex.: SSO callback) e não quer mexer na sessão atual.
|
|
181
|
+
if (options?.setCookie === false) {
|
|
182
|
+
return { status: 1, accessToken: response.data.cookie };
|
|
183
|
+
}
|
|
184
|
+
|
|
157
185
|
await this.setAuthCookie(response.data.cookie);
|
|
158
186
|
|
|
159
187
|
return { status: 1 };
|
|
@@ -1,16 +1,22 @@
|
|
|
1
1
|
import 'server-only';
|
|
2
2
|
|
|
3
3
|
import type { NextRequest } from 'next/server';
|
|
4
|
+
import { parseNumericFields } from '../../../infra/route/parse-numeric';
|
|
4
5
|
import { safeRouteHandler } from '../../../infra/route/safe-route-handler';
|
|
5
6
|
import { searchParamsToParams } from '../../../infra/route/search-params';
|
|
6
7
|
import { projectUsersService } from '../services/project-users.service';
|
|
7
8
|
import type { ListUsersParams } from '../types';
|
|
8
9
|
|
|
10
|
+
const NUMERIC_FIELDS = ['page', 'limit'] as const;
|
|
11
|
+
|
|
9
12
|
export function createListAllAccountUsersHandler() {
|
|
10
13
|
return async function GET(req: NextRequest) {
|
|
11
14
|
return safeRouteHandler(() =>
|
|
12
15
|
projectUsersService.listAllAccountUsers(
|
|
13
|
-
|
|
16
|
+
parseNumericFields<ListUsersParams>(
|
|
17
|
+
searchParamsToParams<ListUsersParams>(req.nextUrl.searchParams),
|
|
18
|
+
NUMERIC_FIELDS
|
|
19
|
+
)
|
|
14
20
|
)
|
|
15
21
|
);
|
|
16
22
|
};
|
|
@@ -2,18 +2,24 @@ import 'server-only';
|
|
|
2
2
|
|
|
3
3
|
import type { NextRequest } from 'next/server';
|
|
4
4
|
import { parseId } from '../../../infra/route/parse-id';
|
|
5
|
+
import { parseNumericFields } from '../../../infra/route/parse-numeric';
|
|
5
6
|
import { safeRouteHandler } from '../../../infra/route/safe-route-handler';
|
|
6
7
|
import { searchParamsToParams } from '../../../infra/route/search-params';
|
|
7
8
|
import { projectUsersService } from '../services/project-users.service';
|
|
8
9
|
import type { ListUsersParams } from '../types';
|
|
9
10
|
|
|
11
|
+
const NUMERIC_FIELDS = ['page', 'limit'] as const;
|
|
12
|
+
|
|
10
13
|
export function createListAvailableUsersHandler() {
|
|
11
14
|
return async function GET(req: NextRequest, { params }: { params: Promise<{ id: string }> }) {
|
|
12
15
|
return safeRouteHandler(async () => {
|
|
13
16
|
const { id } = await params;
|
|
14
17
|
return projectUsersService.listNotInProject(
|
|
15
18
|
parseId(id),
|
|
16
|
-
|
|
19
|
+
parseNumericFields<ListUsersParams>(
|
|
20
|
+
searchParamsToParams<ListUsersParams>(req.nextUrl.searchParams),
|
|
21
|
+
NUMERIC_FIELDS
|
|
22
|
+
)
|
|
17
23
|
);
|
|
18
24
|
});
|
|
19
25
|
};
|
|
@@ -2,18 +2,24 @@ import 'server-only';
|
|
|
2
2
|
|
|
3
3
|
import type { NextRequest } from 'next/server';
|
|
4
4
|
import { parseId } from '../../../infra/route/parse-id';
|
|
5
|
+
import { parseNumericFields } from '../../../infra/route/parse-numeric';
|
|
5
6
|
import { safeRouteHandler } from '../../../infra/route/safe-route-handler';
|
|
6
7
|
import { searchParamsToParams } from '../../../infra/route/search-params';
|
|
7
8
|
import { projectUsersService } from '../services/project-users.service';
|
|
8
9
|
import type { ListUsersParams } from '../types';
|
|
9
10
|
|
|
11
|
+
const NUMERIC_FIELDS = ['page', 'limit'] as const;
|
|
12
|
+
|
|
10
13
|
export function createListProjectUsersHandler() {
|
|
11
14
|
return async function GET(req: NextRequest, { params }: { params: Promise<{ id: string }> }) {
|
|
12
15
|
return safeRouteHandler(async () => {
|
|
13
16
|
const { id } = await params;
|
|
14
17
|
return projectUsersService.listInProject(
|
|
15
18
|
parseId(id),
|
|
16
|
-
|
|
19
|
+
parseNumericFields<ListUsersParams>(
|
|
20
|
+
searchParamsToParams<ListUsersParams>(req.nextUrl.searchParams),
|
|
21
|
+
NUMERIC_FIELDS
|
|
22
|
+
)
|
|
17
23
|
);
|
|
18
24
|
});
|
|
19
25
|
};
|
|
@@ -1,16 +1,22 @@
|
|
|
1
1
|
import 'server-only';
|
|
2
2
|
|
|
3
3
|
import type { NextRequest } from 'next/server';
|
|
4
|
+
import { parseNumericFields } from '../../../infra/route/parse-numeric';
|
|
4
5
|
import { safeRouteHandler } from '../../../infra/route/safe-route-handler';
|
|
5
6
|
import { searchParamsToParams } from '../../../infra/route/search-params';
|
|
6
7
|
import { projectsService } from '../services/projects.service';
|
|
7
8
|
import type { ListProjectsActionParams } from '../actions/list-projects.action';
|
|
8
9
|
|
|
10
|
+
const NUMERIC_FIELDS = ['page', 'limit', 'deleted'] as const;
|
|
11
|
+
|
|
9
12
|
export function createListProjectsHandler() {
|
|
10
13
|
return async function GET(req: NextRequest) {
|
|
11
14
|
return safeRouteHandler(() =>
|
|
12
15
|
projectsService.list(
|
|
13
|
-
|
|
16
|
+
parseNumericFields<ListProjectsActionParams>(
|
|
17
|
+
searchParamsToParams<ListProjectsActionParams>(req.nextUrl.searchParams),
|
|
18
|
+
NUMERIC_FIELDS
|
|
19
|
+
)
|
|
14
20
|
)
|
|
15
21
|
);
|
|
16
22
|
};
|
|
@@ -5,7 +5,7 @@ import { apiFetch } from '../../../infra/http/api-fetch';
|
|
|
5
5
|
import { markMessageAsReadAction } from '../action/mark-message-as-read.action';
|
|
6
6
|
import { markAllMessagesAsReadAction } from '../action/mark-all-messages-as-read.action';
|
|
7
7
|
import { withAction } from '../../../utils/withAction';
|
|
8
|
-
import type { FindMessagesParams,
|
|
8
|
+
import type { FindMessagesParams, ListMessagesResult } from '../schema/messages.schema';
|
|
9
9
|
import { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';
|
|
10
10
|
|
|
11
11
|
export const MESSAGES_QUERY_KEY = ['messages'] as const;
|
|
@@ -18,7 +18,7 @@ export function useMessages(params?: Partial<FindMessagesParams>) {
|
|
|
18
18
|
return useQuery({
|
|
19
19
|
queryKey,
|
|
20
20
|
queryFn: ({ signal }) =>
|
|
21
|
-
apiFetch<
|
|
21
|
+
apiFetch<ListMessagesResult>('/api/messages', { params, signal }),
|
|
22
22
|
});
|
|
23
23
|
}
|
|
24
24
|
|
|
@@ -28,7 +28,7 @@ export function useInfiniteMessages(params?: Partial<Omit<FindMessagesParams, 'p
|
|
|
28
28
|
return useInfiniteQuery({
|
|
29
29
|
queryKey,
|
|
30
30
|
queryFn: ({ pageParam, signal }) =>
|
|
31
|
-
apiFetch<
|
|
31
|
+
apiFetch<ListMessagesResult>('/api/messages', {
|
|
32
32
|
params: {
|
|
33
33
|
...params,
|
|
34
34
|
page: pageParam as number,
|
package/src/route.ts
CHANGED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
"use server";
|
|
2
|
-
import { safeServerAction } from "../../../utils/safeServerAction";
|
|
3
|
-
import { cardsService } from "../services/cards.service";
|
|
4
|
-
async function findCardByIdAction(id) {
|
|
5
|
-
return safeServerAction(() => cardsService.findCardById(id));
|
|
6
|
-
}
|
|
7
|
-
export {
|
|
8
|
-
findCardByIdAction
|
|
9
|
-
};
|
|
10
|
-
//# sourceMappingURL=find-card-by-id.action.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/cards/actions/find-card-by-id.action.ts"],"sourcesContent":["'use server';\n\nimport { safeServerAction } from '../../../utils/safeServerAction';\nimport { cardsService } from '../services/cards.service';\n\nexport async function findCardByIdAction(id: number) {\n return safeServerAction(() => cardsService.findCardById(id));\n}\n"],"mappings":";AAEA,SAAS,wBAAwB;AACjC,SAAS,oBAAoB;AAE7B,eAAsB,mBAAmB,IAAY;AACnD,SAAO,iBAAiB,MAAM,aAAa,aAAa,EAAE,CAAC;AAC7D;","names":[]}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
"use server";
|
|
2
|
-
import { safeServerAction } from "../../../utils/safeServerAction";
|
|
3
|
-
import { cardsService } from "../services/cards.service";
|
|
4
|
-
async function listCardsAction() {
|
|
5
|
-
return safeServerAction(() => cardsService.listCards());
|
|
6
|
-
}
|
|
7
|
-
export {
|
|
8
|
-
listCardsAction
|
|
9
|
-
};
|
|
10
|
-
//# sourceMappingURL=list-cards.action.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/cards/actions/list-cards.action.ts"],"sourcesContent":["'use server';\n\nimport { safeServerAction } from '../../../utils/safeServerAction';\nimport { cardsService } from '../services/cards.service';\n\nexport async function listCardsAction() {\n return safeServerAction(() => cardsService.listCards());\n}\n"],"mappings":";AAEA,SAAS,wBAAwB;AACjC,SAAS,oBAAoB;AAE7B,eAAsB,kBAAkB;AACtC,SAAO,iBAAiB,MAAM,aAAa,UAAU,CAAC;AACxD;","names":[]}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
"use server";
|
|
2
|
-
import { safeServerAction } from "../../../utils/safeServerAction";
|
|
3
|
-
import { chargesService } from "../services/charges.service";
|
|
4
|
-
async function findChargeByIdAction(chargeId) {
|
|
5
|
-
return safeServerAction(() => chargesService.findChargeById(chargeId));
|
|
6
|
-
}
|
|
7
|
-
export {
|
|
8
|
-
findChargeByIdAction
|
|
9
|
-
};
|
|
10
|
-
//# sourceMappingURL=find-charge-by-id.action.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/charges/actions/find-charge-by-id.action.ts"],"sourcesContent":["'use server';\n\nimport { safeServerAction } from '../../../utils/safeServerAction';\nimport { chargesService } from '../services/charges.service';\n\nexport async function findChargeByIdAction(chargeId: string | number) {\n return safeServerAction(() => chargesService.findChargeById(chargeId));\n}\n"],"mappings":";AAEA,SAAS,wBAAwB;AACjC,SAAS,sBAAsB;AAE/B,eAAsB,qBAAqB,UAA2B;AACpE,SAAO,iBAAiB,MAAM,eAAe,eAAe,QAAQ,CAAC;AACvE;","names":[]}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
"use server";
|
|
2
|
-
import { safeServerAction } from "../../../utils/safeServerAction";
|
|
3
|
-
import { chargesService } from "../services/charges.service";
|
|
4
|
-
async function listChargesAction(params) {
|
|
5
|
-
return safeServerAction(() => chargesService.listCharges(params));
|
|
6
|
-
}
|
|
7
|
-
export {
|
|
8
|
-
listChargesAction
|
|
9
|
-
};
|
|
10
|
-
//# sourceMappingURL=list-charges.action.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/charges/actions/list-charges.action.ts"],"sourcesContent":["'use server';\n\nimport { safeServerAction } from '../../../utils/safeServerAction';\nimport type { FindChargesParams } from '../types/charge.type';\nimport { chargesService } from '../services/charges.service';\n\nexport async function listChargesAction(params?: Partial<FindChargesParams>) {\n return safeServerAction(() => chargesService.listCharges(params));\n}\n"],"mappings":";AAEA,SAAS,wBAAwB;AAEjC,SAAS,sBAAsB;AAE/B,eAAsB,kBAAkB,QAAqC;AAC3E,SAAO,iBAAiB,MAAM,eAAe,YAAY,MAAM,CAAC;AAClE;","names":[]}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
"use server";
|
|
2
|
-
import { safeServerAction } from "../../../utils/safeServerAction";
|
|
3
|
-
import { iaCreditsService } from "../services/ia-credits.service";
|
|
4
|
-
async function listIaCreditsAction(subscriptionId) {
|
|
5
|
-
return safeServerAction(() => iaCreditsService.listOperations(subscriptionId));
|
|
6
|
-
}
|
|
7
|
-
export {
|
|
8
|
-
listIaCreditsAction
|
|
9
|
-
};
|
|
10
|
-
//# sourceMappingURL=list-ia-credits.action.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/ia-credits/actions/list-ia-credits.action.ts"],"sourcesContent":["'use server';\n\nimport { safeServerAction } from '../../../utils/safeServerAction';\nimport { iaCreditsService } from '../services/ia-credits.service';\n\nexport async function listIaCreditsAction(subscriptionId: number | string) {\n return safeServerAction(() => iaCreditsService.listOperations(subscriptionId));\n}\n"],"mappings":";AAEA,SAAS,wBAAwB;AACjC,SAAS,wBAAwB;AAEjC,eAAsB,oBAAoB,gBAAiC;AACzE,SAAO,iBAAiB,MAAM,iBAAiB,eAAe,cAAc,CAAC;AAC/E;","names":[]}
|
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
"use server";
|
|
2
|
-
import { safeServerAction } from "../../../utils/safeServerAction";
|
|
3
|
-
import { pagesService } from "../services/pages.service";
|
|
4
|
-
async function countPagesAction() {
|
|
5
|
-
return safeServerAction(async () => ({
|
|
6
|
-
total: await pagesService.countPages()
|
|
7
|
-
}));
|
|
8
|
-
}
|
|
9
|
-
export {
|
|
10
|
-
countPagesAction
|
|
11
|
-
};
|
|
12
|
-
//# sourceMappingURL=count-pages.action.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/pages/actions/count-pages.action.ts"],"sourcesContent":["'use server';\n\nimport { safeServerAction } from '../../../utils/safeServerAction';\nimport { pagesService } from '../services/pages.service';\n\nexport async function countPagesAction() {\n return safeServerAction(async () => ({\n total: await pagesService.countPages(),\n }));\n}\n"],"mappings":";AAEA,SAAS,wBAAwB;AACjC,SAAS,oBAAoB;AAE7B,eAAsB,mBAAmB;AACvC,SAAO,iBAAiB,aAAa;AAAA,IACnC,OAAO,MAAM,aAAa,WAAW;AAAA,EACvC,EAAE;AACJ;","names":[]}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
"use server";
|
|
2
|
-
import { safeServerAction } from "../../../utils/safeServerAction";
|
|
3
|
-
import { plansService } from "../services/plans.service";
|
|
4
|
-
async function findPlanByIdAction(idPlan) {
|
|
5
|
-
return safeServerAction(() => plansService.findById(idPlan));
|
|
6
|
-
}
|
|
7
|
-
export {
|
|
8
|
-
findPlanByIdAction
|
|
9
|
-
};
|
|
10
|
-
//# sourceMappingURL=find-plan-by-id.action.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/plans/actions/find-plan-by-id.action.ts"],"sourcesContent":["'use server';\n\nimport { safeServerAction } from '../../../utils/safeServerAction';\nimport { plansService } from '../services/plans.service';\n\nexport async function findPlanByIdAction(idPlan: number | string) {\n return safeServerAction(() => plansService.findById(idPlan));\n}\n"],"mappings":";AAEA,SAAS,wBAAwB;AACjC,SAAS,oBAAoB;AAE7B,eAAsB,mBAAmB,QAAyB;AAChE,SAAO,iBAAiB,MAAM,aAAa,SAAS,MAAM,CAAC;AAC7D;","names":[]}
|
|
@@ -1,17 +0,0 @@
|
|
|
1
|
-
"use server";
|
|
2
|
-
import { plansService, safeServerAction } from "@greatapps/common/server";
|
|
3
|
-
async function listPlansAction() {
|
|
4
|
-
return safeServerAction(async () => {
|
|
5
|
-
const { data: apiPlans } = await plansService.listPlans({
|
|
6
|
-
active: true,
|
|
7
|
-
search: "client",
|
|
8
|
-
sort: "id:ASC"
|
|
9
|
-
});
|
|
10
|
-
if (!apiPlans?.length) return [];
|
|
11
|
-
return [...apiPlans].sort((a, b) => a.value - b.value);
|
|
12
|
-
});
|
|
13
|
-
}
|
|
14
|
-
export {
|
|
15
|
-
listPlansAction
|
|
16
|
-
};
|
|
17
|
-
//# sourceMappingURL=list-plans.action.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/plans/actions/list-plans.action.ts"],"sourcesContent":["'use server';\n\nimport { plansService, safeServerAction } from '@greatapps/common/server';\n\nexport async function listPlansAction() {\n return safeServerAction(async () => {\n const { data: apiPlans } = await plansService.listPlans({\n active: true,\n search: 'client',\n sort: 'id:ASC',\n });\n\n if (!apiPlans?.length) return [];\n\n return [...apiPlans].sort((a, b) => a.value - b.value);\n });\n}\n"],"mappings":";AAEA,SAAS,cAAc,wBAAwB;AAE/C,eAAsB,kBAAkB;AACtC,SAAO,iBAAiB,YAAY;AAClC,UAAM,EAAE,MAAM,SAAS,IAAI,MAAM,aAAa,UAAU;AAAA,MACtD,QAAQ;AAAA,MACR,QAAQ;AAAA,MACR,MAAM;AAAA,IACR,CAAC;AAED,QAAI,CAAC,UAAU,OAAQ,QAAO,CAAC;AAE/B,WAAO,CAAC,GAAG,QAAQ,EAAE,KAAK,CAAC,GAAG,MAAM,EAAE,QAAQ,EAAE,KAAK;AAAA,EACvD,CAAC;AACH;","names":[]}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
"use server";
|
|
2
|
-
import { safeServerAction } from "../../../utils/safeServerAction";
|
|
3
|
-
import { projectUsersService } from "../services/project-users.service";
|
|
4
|
-
async function listAllAccountUsersAction(params = {}) {
|
|
5
|
-
return safeServerAction(() => projectUsersService.listAllAccountUsers(params));
|
|
6
|
-
}
|
|
7
|
-
export {
|
|
8
|
-
listAllAccountUsersAction
|
|
9
|
-
};
|
|
10
|
-
//# sourceMappingURL=list-all-account-users.action.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/projects/actions/list-all-account-users.action.ts"],"sourcesContent":["'use server';\n\nimport { safeServerAction } from '../../../utils/safeServerAction';\nimport { projectUsersService } from '../services/project-users.service';\nimport type { ListUsersParams } from '../types';\n\nexport async function listAllAccountUsersAction(params: ListUsersParams = {}) {\n return safeServerAction(() => projectUsersService.listAllAccountUsers(params));\n}\n"],"mappings":";AAEA,SAAS,wBAAwB;AACjC,SAAS,2BAA2B;AAGpC,eAAsB,0BAA0B,SAA0B,CAAC,GAAG;AAC5E,SAAO,iBAAiB,MAAM,oBAAoB,oBAAoB,MAAM,CAAC;AAC/E;","names":[]}
|
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
"use server";
|
|
2
|
-
import { safeServerAction } from "../../../utils/safeServerAction";
|
|
3
|
-
import { projectUsersService } from "../services/project-users.service";
|
|
4
|
-
async function listAvailableUsersAction(projectId, params = {}) {
|
|
5
|
-
return safeServerAction(() => projectUsersService.listNotInProject(projectId, params));
|
|
6
|
-
}
|
|
7
|
-
export {
|
|
8
|
-
listAvailableUsersAction
|
|
9
|
-
};
|
|
10
|
-
//# sourceMappingURL=list-available-users.action.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/projects/actions/list-available-users.action.ts"],"sourcesContent":["'use server';\n\nimport { safeServerAction } from '../../../utils/safeServerAction';\nimport { projectUsersService } from '../services/project-users.service';\nimport type { ListUsersParams } from '../types';\n\nexport async function listAvailableUsersAction(projectId: number, params: ListUsersParams = {}) {\n return safeServerAction(() => projectUsersService.listNotInProject(projectId, params));\n}\n"],"mappings":";AAEA,SAAS,wBAAwB;AACjC,SAAS,2BAA2B;AAGpC,eAAsB,yBAAyB,WAAmB,SAA0B,CAAC,GAAG;AAC9F,SAAO,iBAAiB,MAAM,oBAAoB,iBAAiB,WAAW,MAAM,CAAC;AACvF;","names":[]}
|
|
@@ -1,25 +0,0 @@
|
|
|
1
|
-
"use server";
|
|
2
|
-
import { safeServerAction } from "../../../utils/safeServerAction";
|
|
3
|
-
import { messagesService } from "../services/messages.service";
|
|
4
|
-
import { findWhitelabel } from "../../whitelabel/actions/find-whitelabel.action";
|
|
5
|
-
async function listMessagesAction(params) {
|
|
6
|
-
return safeServerAction(async () => {
|
|
7
|
-
const [result, whitelabel] = await Promise.all([
|
|
8
|
-
messagesService.listMessages(params),
|
|
9
|
-
findWhitelabel()
|
|
10
|
-
]);
|
|
11
|
-
const urlMap = {
|
|
12
|
-
pages_url: whitelabel?.pages_url ?? "",
|
|
13
|
-
accounts_url: whitelabel?.accounts_url ?? "",
|
|
14
|
-
editor_url: whitelabel?.editor_url ?? ""
|
|
15
|
-
};
|
|
16
|
-
return { data: result.data.map((message) => ({
|
|
17
|
-
...message,
|
|
18
|
-
url: message.url.replace(/\{(pages_url|accounts_url|editor_url)\}/g, (_, key) => urlMap[key] ?? "")
|
|
19
|
-
})), total: result.total, totalUnread: result.totalUnread };
|
|
20
|
-
});
|
|
21
|
-
}
|
|
22
|
-
export {
|
|
23
|
-
listMessagesAction
|
|
24
|
-
};
|
|
25
|
-
//# sourceMappingURL=list-messages.action.mjs.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../src/modules/users/action/list-messages.action.ts"],"sourcesContent":["'use server';\n\nimport { safeServerAction } from '../../../utils/safeServerAction';\nimport { messagesService } from '../services/messages.service';\nimport type { FindMessagesParams } from '../schema/messages.schema';\nimport { findWhitelabel } from '../../whitelabel/actions/find-whitelabel.action';\n\nexport async function listMessagesAction(params?: Partial<FindMessagesParams>) {\n return safeServerAction(async () => {\n const [result, whitelabel] = await Promise.all([\n messagesService.listMessages(params),\n findWhitelabel(),\n ]);\n\n const urlMap: Record<string, string> = {\n pages_url: whitelabel?.pages_url ?? '',\n accounts_url: whitelabel?.accounts_url ?? '',\n editor_url: whitelabel?.editor_url ?? '',\n };\n\n return { data: result.data.map((message) => ({\n ...message,\n url: message.url.replace(/\\{(pages_url|accounts_url|editor_url)\\}/g, (_, key) => urlMap[key] ?? ''),\n })), total: result.total, totalUnread: result.totalUnread };\n });\n}\n"],"mappings":";AAEA,SAAS,wBAAwB;AACjC,SAAS,uBAAuB;AAEhC,SAAS,sBAAsB;AAE/B,eAAsB,mBAAmB,QAAsC;AAC7E,SAAO,iBAAiB,YAAY;AAClC,UAAM,CAAC,QAAQ,UAAU,IAAI,MAAM,QAAQ,IAAI;AAAA,MAC7C,gBAAgB,aAAa,MAAM;AAAA,MACnC,eAAe;AAAA,IACjB,CAAC;AAED,UAAM,SAAiC;AAAA,MACrC,WAAW,YAAY,aAAa;AAAA,MACpC,cAAc,YAAY,gBAAgB;AAAA,MAC1C,YAAY,YAAY,cAAc;AAAA,IACxC;AAEA,WAAO,EAAE,MAAM,OAAO,KAAK,IAAI,CAAC,aAAa;AAAA,MAC3C,GAAG;AAAA,MACH,KAAK,QAAQ,IAAI,QAAQ,4CAA4C,CAAC,GAAG,QAAQ,OAAO,GAAG,KAAK,EAAE;AAAA,IACpG,EAAE,GAAG,OAAO,OAAO,OAAO,aAAa,OAAO,YAAY;AAAA,EAC5D,CAAC;AACH;","names":[]}
|