@greatapps/common 1.1.492 → 1.1.495

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (55) hide show
  1. package/dist/components/layouts/AppNavBar.mjs +4 -8
  2. package/dist/components/layouts/AppNavBar.mjs.map +1 -1
  3. package/dist/components/layouts/NavBar.mjs +8 -7
  4. package/dist/components/layouts/NavBar.mjs.map +1 -1
  5. package/dist/components/navigation/ProjectSelectorPopover.mjs +0 -1
  6. package/dist/components/navigation/ProjectSelectorPopover.mjs.map +1 -1
  7. package/dist/components/navigation/subcomponents/ProjectSelector.mjs +10 -11
  8. package/dist/components/navigation/subcomponents/ProjectSelector.mjs.map +1 -1
  9. package/dist/index.mjs +22 -0
  10. package/dist/index.mjs.map +1 -1
  11. package/dist/modules/projects/actions/create-project.action.mjs +10 -0
  12. package/dist/modules/projects/actions/create-project.action.mjs.map +1 -0
  13. package/dist/modules/projects/actions/delete-project.action.mjs +10 -0
  14. package/dist/modules/projects/actions/delete-project.action.mjs.map +1 -0
  15. package/dist/modules/projects/actions/list-projects.action.mjs +10 -0
  16. package/dist/modules/projects/actions/list-projects.action.mjs.map +1 -0
  17. package/dist/modules/projects/actions/update-project.action.mjs +10 -0
  18. package/dist/modules/projects/actions/update-project.action.mjs.map +1 -0
  19. package/dist/modules/projects/hooks/create-project.hook.mjs +20 -0
  20. package/dist/modules/projects/hooks/create-project.hook.mjs.map +1 -0
  21. package/dist/modules/projects/hooks/delete-project.hook.mjs +20 -0
  22. package/dist/modules/projects/hooks/delete-project.hook.mjs.map +1 -0
  23. package/dist/modules/projects/hooks/list-infinite-projects.hook.mjs +38 -0
  24. package/dist/modules/projects/hooks/list-infinite-projects.hook.mjs.map +1 -0
  25. package/dist/modules/projects/hooks/list-projects.hook.mjs +22 -0
  26. package/dist/modules/projects/hooks/list-projects.hook.mjs.map +1 -0
  27. package/dist/modules/projects/hooks/update-project.hook.mjs +20 -0
  28. package/dist/modules/projects/hooks/update-project.hook.mjs.map +1 -0
  29. package/dist/modules/projects/services/projects.service.mjs +83 -0
  30. package/dist/modules/projects/services/projects.service.mjs.map +1 -0
  31. package/dist/modules/projects/types.mjs +15 -0
  32. package/dist/modules/projects/types.mjs.map +1 -1
  33. package/dist/server.mjs +10 -0
  34. package/dist/server.mjs.map +1 -1
  35. package/package.json +1 -1
  36. package/src/components/layouts/AppNavBar.tsx +6 -12
  37. package/src/components/layouts/NavBar.tsx +31 -28
  38. package/src/components/navigation/ProjectSelectorPopover.tsx +5 -7
  39. package/src/components/navigation/subcomponents/ProjectSelector.tsx +14 -19
  40. package/src/index.ts +18 -1
  41. package/src/modules/projects/actions/create-project.action.ts +9 -0
  42. package/src/modules/projects/actions/delete-project.action.ts +8 -0
  43. package/src/modules/projects/actions/list-projects.action.ts +16 -0
  44. package/src/modules/projects/actions/update-project.action.ts +9 -0
  45. package/src/modules/projects/hooks/create-project.hook.ts +21 -0
  46. package/src/modules/projects/hooks/delete-project.hook.ts +20 -0
  47. package/src/modules/projects/hooks/list-infinite-projects.hook.ts +42 -0
  48. package/src/modules/projects/hooks/list-projects.hook.ts +23 -0
  49. package/src/modules/projects/hooks/update-project.hook.ts +21 -0
  50. package/src/modules/projects/services/projects.service.ts +123 -0
  51. package/src/modules/projects/types.ts +46 -0
  52. package/src/server.ts +7 -0
  53. package/dist/components/navigation/types.mjs +0 -1
  54. package/dist/components/navigation/types.mjs.map +0 -1
  55. package/src/components/navigation/types.ts +0 -6
@@ -0,0 +1,20 @@
1
+ "use client";
2
+ import { useMutation, useQueryClient } from "@tanstack/react-query";
3
+ import { createProjectAction } from "../actions/create-project.action";
4
+ import { withAction } from "../../../utils/withAction";
5
+ import { useAuthQueryKey } from "../../../hooks/useAuthQueryKey";
6
+ import { PROJECTS_BASE_KEY } from "./list-projects.hook";
7
+ function useCreateProject() {
8
+ const queryClient = useQueryClient();
9
+ const projectsKey = useAuthQueryKey([...PROJECTS_BASE_KEY]);
10
+ return useMutation({
11
+ mutationFn: (data) => withAction(createProjectAction)(data),
12
+ onSuccess: () => {
13
+ queryClient.invalidateQueries({ queryKey: projectsKey });
14
+ }
15
+ });
16
+ }
17
+ export {
18
+ useCreateProject
19
+ };
20
+ //# sourceMappingURL=create-project.hook.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/modules/projects/hooks/create-project.hook.ts"],"sourcesContent":["'use client';\n\nimport { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { createProjectAction } from '../actions/create-project.action';\nimport { withAction } from '../../../utils/withAction';\nimport { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';\nimport { PROJECTS_BASE_KEY } from './list-projects.hook';\nimport type { CreateProjectRequest } from '../types';\n\nexport function useCreateProject() {\n const queryClient = useQueryClient();\n const projectsKey = useAuthQueryKey([...PROJECTS_BASE_KEY]);\n\n return useMutation({\n mutationFn: (data: CreateProjectRequest) =>\n withAction(createProjectAction)(data),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: projectsKey });\n },\n });\n}\n"],"mappings":";AAEA,SAAS,aAAa,sBAAsB;AAC5C,SAAS,2BAA2B;AACpC,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AAChC,SAAS,yBAAyB;AAG3B,SAAS,mBAAmB;AACjC,QAAM,cAAc,eAAe;AACnC,QAAM,cAAc,gBAAgB,CAAC,GAAG,iBAAiB,CAAC;AAE1D,SAAO,YAAY;AAAA,IACjB,YAAY,CAAC,SACX,WAAW,mBAAmB,EAAE,IAAI;AAAA,IACtC,WAAW,MAAM;AACf,kBAAY,kBAAkB,EAAE,UAAU,YAAY,CAAC;AAAA,IACzD;AAAA,EACF,CAAC;AACH;","names":[]}
@@ -0,0 +1,20 @@
1
+ "use client";
2
+ import { useMutation, useQueryClient } from "@tanstack/react-query";
3
+ import { deleteProjectAction } from "../actions/delete-project.action";
4
+ import { withAction } from "../../../utils/withAction";
5
+ import { useAuthQueryKey } from "../../../hooks/useAuthQueryKey";
6
+ import { PROJECTS_BASE_KEY } from "./list-projects.hook";
7
+ function useDeleteProject() {
8
+ const queryClient = useQueryClient();
9
+ const projectsKey = useAuthQueryKey([...PROJECTS_BASE_KEY]);
10
+ return useMutation({
11
+ mutationFn: ({ projectId, moveToProjectId }) => withAction(deleteProjectAction)(projectId, moveToProjectId),
12
+ onSuccess: () => {
13
+ queryClient.invalidateQueries({ queryKey: projectsKey });
14
+ }
15
+ });
16
+ }
17
+ export {
18
+ useDeleteProject
19
+ };
20
+ //# sourceMappingURL=delete-project.hook.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/modules/projects/hooks/delete-project.hook.ts"],"sourcesContent":["'use client';\n\nimport { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { deleteProjectAction } from '../actions/delete-project.action';\nimport { withAction } from '../../../utils/withAction';\nimport { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';\nimport { PROJECTS_BASE_KEY } from './list-projects.hook';\n\nexport function useDeleteProject() {\n const queryClient = useQueryClient();\n const projectsKey = useAuthQueryKey([...PROJECTS_BASE_KEY]);\n\n return useMutation({\n mutationFn: ({ projectId, moveToProjectId }: { projectId: number; moveToProjectId: number }) =>\n withAction(deleteProjectAction)(projectId, moveToProjectId),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: projectsKey });\n },\n });\n}\n"],"mappings":";AAEA,SAAS,aAAa,sBAAsB;AAC5C,SAAS,2BAA2B;AACpC,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AAChC,SAAS,yBAAyB;AAE3B,SAAS,mBAAmB;AACjC,QAAM,cAAc,eAAe;AACnC,QAAM,cAAc,gBAAgB,CAAC,GAAG,iBAAiB,CAAC;AAE1D,SAAO,YAAY;AAAA,IACjB,YAAY,CAAC,EAAE,WAAW,gBAAgB,MACxC,WAAW,mBAAmB,EAAE,WAAW,eAAe;AAAA,IAC5D,WAAW,MAAM;AACf,kBAAY,kBAAkB,EAAE,UAAU,YAAY,CAAC;AAAA,IACzD;AAAA,EACF,CAAC;AACH;","names":[]}
@@ -0,0 +1,38 @@
1
+ "use client";
2
+ import { useInfiniteQuery } from "@tanstack/react-query";
3
+ import { listProjectsAction } from "../actions/list-projects.action";
4
+ import { withAction } from "../../../utils/withAction";
5
+ import { useAuthQueryKey } from "../../../hooks/useAuthQueryKey";
6
+ import { PROJECTS_BASE_KEY } from "./list-projects.hook";
7
+ const PAGE_SIZE = 20;
8
+ const INFINITE_PROJECTS_QUERY_KEY = (params) => [...PROJECTS_BASE_KEY, "infinite", params];
9
+ function useInfiniteProjects({
10
+ limit = PAGE_SIZE,
11
+ ...params
12
+ }) {
13
+ const queryKey = useAuthQueryKey([...INFINITE_PROJECTS_QUERY_KEY(params)]);
14
+ return useInfiniteQuery({
15
+ queryKey,
16
+ queryFn: ({ pageParam }) => withAction(
17
+ () => listProjectsAction({
18
+ ...params,
19
+ page: pageParam,
20
+ limit: PAGE_SIZE
21
+ })
22
+ )(),
23
+ initialPageParam: 1,
24
+ getNextPageParam: (lastPage, allPages) => {
25
+ const loaded = allPages.reduce((sum, p) => sum + p.data.length, 0);
26
+ return loaded < lastPage.total ? allPages.length + 1 : void 0;
27
+ },
28
+ staleTime: 3e4,
29
+ refetchOnMount: true,
30
+ refetchOnWindowFocus: true,
31
+ refetchOnReconnect: true
32
+ });
33
+ }
34
+ export {
35
+ INFINITE_PROJECTS_QUERY_KEY,
36
+ useInfiniteProjects
37
+ };
38
+ //# sourceMappingURL=list-infinite-projects.hook.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/modules/projects/hooks/list-infinite-projects.hook.ts"],"sourcesContent":["\"use client\";\n\nimport { useInfiniteQuery } from \"@tanstack/react-query\";\nimport { listProjectsAction } from \"../actions/list-projects.action\";\nimport type { ListProjectsActionParams } from \"../actions/list-projects.action\";\nimport { withAction } from \"../../../utils/withAction\";\nimport { useAuthQueryKey } from \"../../../hooks/useAuthQueryKey\";\nimport { PROJECTS_BASE_KEY } from \"./list-projects.hook\";\n\nconst PAGE_SIZE = 20;\n\nexport const INFINITE_PROJECTS_QUERY_KEY = (\n params?: Omit<ListProjectsActionParams, \"page\">,\n) => [...PROJECTS_BASE_KEY, \"infinite\", params] as const;\n\nexport function useInfiniteProjects({\n limit = PAGE_SIZE,\n ...params\n}: Omit<ListProjectsActionParams, \"page\">) {\n const queryKey = useAuthQueryKey([...INFINITE_PROJECTS_QUERY_KEY(params)]);\n\n return useInfiniteQuery({\n queryKey,\n queryFn: ({ pageParam }) =>\n withAction(() =>\n listProjectsAction({\n ...params,\n page: pageParam as number,\n limit: PAGE_SIZE,\n }),\n )(),\n initialPageParam: 1,\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 staleTime: 30_000,\n refetchOnMount: true,\n refetchOnWindowFocus: true,\n refetchOnReconnect: true,\n });\n}\n"],"mappings":";AAEA,SAAS,wBAAwB;AACjC,SAAS,0BAA0B;AAEnC,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AAChC,SAAS,yBAAyB;AAElC,MAAM,YAAY;AAEX,MAAM,8BAA8B,CACzC,WACG,CAAC,GAAG,mBAAmB,YAAY,MAAM;AAEvC,SAAS,oBAAoB;AAAA,EAClC,QAAQ;AAAA,EACR,GAAG;AACL,GAA2C;AACzC,QAAM,WAAW,gBAAgB,CAAC,GAAG,4BAA4B,MAAM,CAAC,CAAC;AAEzE,SAAO,iBAAiB;AAAA,IACtB;AAAA,IACA,SAAS,CAAC,EAAE,UAAU,MACpB;AAAA,MAAW,MACT,mBAAmB;AAAA,QACjB,GAAG;AAAA,QACH,MAAM;AAAA,QACN,OAAO;AAAA,MACT,CAAC;AAAA,IACH,EAAE;AAAA,IACJ,kBAAkB;AAAA,IAClB,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,WAAW;AAAA,IACX,gBAAgB;AAAA,IAChB,sBAAsB;AAAA,IACtB,oBAAoB;AAAA,EACtB,CAAC;AACH;","names":[]}
@@ -0,0 +1,22 @@
1
+ "use client";
2
+ import { useQuery, keepPreviousData } from "@tanstack/react-query";
3
+ import { listProjectsAction } from "../actions/list-projects.action";
4
+ import { withAction } from "../../../utils/withAction";
5
+ import { useAuthQueryKey } from "../../../hooks/useAuthQueryKey";
6
+ const PROJECTS_BASE_KEY = ["projects"];
7
+ const PROJECTS_QUERY_KEY = (params) => [...PROJECTS_BASE_KEY, params];
8
+ function useProjects(params) {
9
+ const queryKey = useAuthQueryKey([...PROJECTS_QUERY_KEY(params)]);
10
+ return useQuery({
11
+ queryKey,
12
+ queryFn: withAction(() => listProjectsAction(params)),
13
+ staleTime: 3e4,
14
+ placeholderData: keepPreviousData
15
+ });
16
+ }
17
+ export {
18
+ PROJECTS_BASE_KEY,
19
+ PROJECTS_QUERY_KEY,
20
+ useProjects
21
+ };
22
+ //# sourceMappingURL=list-projects.hook.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/modules/projects/hooks/list-projects.hook.ts"],"sourcesContent":["'use client';\n\nimport { useQuery, keepPreviousData } from '@tanstack/react-query';\nimport { listProjectsAction } from '../actions/list-projects.action';\nimport type { ListProjectsActionParams } from '../actions/list-projects.action';\nimport { withAction } from '../../../utils/withAction';\nimport { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';\n\nexport const PROJECTS_BASE_KEY = ['projects'] as const;\n\nexport const PROJECTS_QUERY_KEY = (params?: ListProjectsActionParams) =>\n [...PROJECTS_BASE_KEY, params] as const;\n\nexport function useProjects(params?: ListProjectsActionParams) {\n const queryKey = useAuthQueryKey([...PROJECTS_QUERY_KEY(params)]);\n\n return useQuery({\n queryKey,\n queryFn: withAction(() => listProjectsAction(params)),\n staleTime: 30_000,\n placeholderData: keepPreviousData,\n });\n}\n"],"mappings":";AAEA,SAAS,UAAU,wBAAwB;AAC3C,SAAS,0BAA0B;AAEnC,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AAEzB,MAAM,oBAAoB,CAAC,UAAU;AAErC,MAAM,qBAAqB,CAAC,WACjC,CAAC,GAAG,mBAAmB,MAAM;AAExB,SAAS,YAAY,QAAmC;AAC7D,QAAM,WAAW,gBAAgB,CAAC,GAAG,mBAAmB,MAAM,CAAC,CAAC;AAEhE,SAAO,SAAS;AAAA,IACd;AAAA,IACA,SAAS,WAAW,MAAM,mBAAmB,MAAM,CAAC;AAAA,IACpD,WAAW;AAAA,IACX,iBAAiB;AAAA,EACnB,CAAC;AACH;","names":[]}
@@ -0,0 +1,20 @@
1
+ "use client";
2
+ import { useMutation, useQueryClient } from "@tanstack/react-query";
3
+ import { updateProjectAction } from "../actions/update-project.action";
4
+ import { withAction } from "../../../utils/withAction";
5
+ import { useAuthQueryKey } from "../../../hooks/useAuthQueryKey";
6
+ import { PROJECTS_BASE_KEY } from "./list-projects.hook";
7
+ function useUpdateProject() {
8
+ const queryClient = useQueryClient();
9
+ const projectsKey = useAuthQueryKey([...PROJECTS_BASE_KEY]);
10
+ return useMutation({
11
+ mutationFn: ({ projectId, data }) => withAction(updateProjectAction)(projectId, data),
12
+ onSuccess: () => {
13
+ queryClient.invalidateQueries({ queryKey: projectsKey });
14
+ }
15
+ });
16
+ }
17
+ export {
18
+ useUpdateProject
19
+ };
20
+ //# sourceMappingURL=update-project.hook.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/modules/projects/hooks/update-project.hook.ts"],"sourcesContent":["'use client';\n\nimport { useMutation, useQueryClient } from '@tanstack/react-query';\nimport { updateProjectAction } from '../actions/update-project.action';\nimport { withAction } from '../../../utils/withAction';\nimport { useAuthQueryKey } from '../../../hooks/useAuthQueryKey';\nimport { PROJECTS_BASE_KEY } from './list-projects.hook';\nimport type { UpdateProjectRequest } from '../types';\n\nexport function useUpdateProject() {\n const queryClient = useQueryClient();\n const projectsKey = useAuthQueryKey([...PROJECTS_BASE_KEY]);\n\n return useMutation({\n mutationFn: ({ projectId, data }: { projectId: number; data: UpdateProjectRequest }) =>\n withAction(updateProjectAction)(projectId, data),\n onSuccess: () => {\n queryClient.invalidateQueries({ queryKey: projectsKey });\n },\n });\n}\n"],"mappings":";AAEA,SAAS,aAAa,sBAAsB;AAC5C,SAAS,2BAA2B;AACpC,SAAS,kBAAkB;AAC3B,SAAS,uBAAuB;AAChC,SAAS,yBAAyB;AAG3B,SAAS,mBAAmB;AACjC,QAAM,cAAc,eAAe;AACnC,QAAM,cAAc,gBAAgB,CAAC,GAAG,iBAAiB,CAAC;AAE1D,SAAO,YAAY;AAAA,IACjB,YAAY,CAAC,EAAE,WAAW,KAAK,MAC7B,WAAW,mBAAmB,EAAE,WAAW,IAAI;AAAA,IACjD,WAAW,MAAM;AACf,kBAAY,kBAAkB,EAAE,UAAU,YAAY,CAAC;AAAA,IACzD;AAAA,EACF,CAAC;AACH;","names":[]}
@@ -0,0 +1,83 @@
1
+ import "server-only";
2
+ import { api } from "../../../infra/api/client";
3
+ import { ApiError } from "../../../infra/api/types";
4
+ import { buildQueryParams } from "../../../infra/utils/params";
5
+ import { getUserContext } from "../../auth/utils/get-user-context";
6
+ import { assertManagementSubscription } from "../../auth/utils/assert-management-subscription";
7
+ import {
8
+ ProjectSchema
9
+ } from "../types";
10
+ class ProjectsService {
11
+ async list(params = {}) {
12
+ const { id_account, id_user } = await getUserContext();
13
+ const query = buildQueryParams(params);
14
+ const url = `/account/${id_account}/user/${id_user}/projects${query ? `?${query}` : ""}`;
15
+ const response = await api.apps.get(url);
16
+ if (response.status === 0) {
17
+ throw new ApiError(
18
+ response.message || "Erro ao listar projetos",
19
+ "LIST_PROJECTS_FAILED",
20
+ 400
21
+ );
22
+ }
23
+ return {
24
+ data: (response.data || []).map((item) => ProjectSchema.parse(item)),
25
+ total: response.total || 0,
26
+ page: params.page ?? 1
27
+ };
28
+ }
29
+ async create(data) {
30
+ await assertManagementSubscription();
31
+ const { id_account, id_user } = await getUserContext();
32
+ const url = `/account/${id_account}/user/${id_user}/projects`;
33
+ const response = await api.apps.post(url, data);
34
+ if (response.status === 0) {
35
+ throw new ApiError(
36
+ response.message || "Erro ao criar projeto",
37
+ "CREATE_PROJECT_FAILED",
38
+ 400
39
+ );
40
+ }
41
+ if (!response.data || response.data.length === 0) {
42
+ throw new ApiError("Resposta inv\xE1lida ao criar projeto", "INVALID_RESPONSE", 500);
43
+ }
44
+ return ProjectSchema.parse(response.data[0]);
45
+ }
46
+ async update(projectId, data) {
47
+ await assertManagementSubscription();
48
+ const { id_account, id_user } = await getUserContext();
49
+ const url = `/account/${id_account}/user/${id_user}/projects/${projectId}`;
50
+ const response = await api.apps.put(url, data);
51
+ if (response.status === 0) {
52
+ throw new ApiError(
53
+ response.message || "Erro ao atualizar projeto",
54
+ "UPDATE_PROJECT_FAILED",
55
+ 400
56
+ );
57
+ }
58
+ if (!response.data || response.data.length === 0) {
59
+ throw new ApiError("Resposta inv\xE1lida ao atualizar projeto", "INVALID_RESPONSE", 500);
60
+ }
61
+ return ProjectSchema.parse(response.data[0]);
62
+ }
63
+ async delete(projectId, moveToProjectId) {
64
+ await assertManagementSubscription();
65
+ const { id_account, id_user } = await getUserContext();
66
+ const url = `/account/${id_account}/user/${id_user}/projects/${projectId}`;
67
+ const response = await api.apps.delete(url, {
68
+ body: JSON.stringify({ id_project_to_move: moveToProjectId })
69
+ });
70
+ if (response.status === 0) {
71
+ throw new ApiError(
72
+ response.message || "Erro ao deletar projeto",
73
+ "DELETE_PROJECT_FAILED",
74
+ 400
75
+ );
76
+ }
77
+ }
78
+ }
79
+ const projectsService = new ProjectsService();
80
+ export {
81
+ projectsService
82
+ };
83
+ //# sourceMappingURL=projects.service.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../src/modules/projects/services/projects.service.ts"],"sourcesContent":["import 'server-only';\n\nimport { api } from '../../../infra/api/client';\nimport { ApiError } from '../../../infra/api/types';\nimport { buildQueryParams } from '../../../infra/utils/params';\nimport { getUserContext } from '../../auth/utils/get-user-context';\nimport { assertManagementSubscription } from '../../auth/utils/assert-management-subscription';\nimport {\n Project,\n ProjectSchema,\n ProjectsPage,\n CreateProjectRequest,\n UpdateProjectRequest,\n} from '../types';\n\ninterface ApiListResponse<T> {\n data: T[];\n total: number;\n status: number;\n message?: string;\n}\n\ninterface ApiMutationResponse {\n status: number;\n message?: string;\n data?: Project[];\n}\n\ninterface ListProjectsParams {\n page?: number;\n limit?: number;\n sort?: string;\n search?: string;\n deleted?: number;\n}\n\nclass ProjectsService {\n async list(params: ListProjectsParams = {}): Promise<ProjectsPage> {\n const { id_account, id_user } = await getUserContext();\n const query = buildQueryParams(params as Record<string, string | number | boolean | undefined>);\n const url = `/account/${id_account}/user/${id_user}/projects${query ? `?${query}` : ''}`;\n\n const response = await api.apps.get<ApiListResponse<Project>>(url);\n\n if (response.status === 0) {\n throw new ApiError(\n response.message || 'Erro ao listar projetos',\n 'LIST_PROJECTS_FAILED',\n 400\n );\n }\n\n return {\n data: (response.data || []).map((item) => ProjectSchema.parse(item)),\n total: response.total || 0,\n page: params.page ?? 1,\n };\n }\n\n async create(data: CreateProjectRequest): Promise<Project> {\n await assertManagementSubscription();\n const { id_account, id_user } = await getUserContext();\n const url = `/account/${id_account}/user/${id_user}/projects`;\n\n const response = await api.apps.post<ApiMutationResponse>(url, data);\n\n if (response.status === 0) {\n throw new ApiError(\n response.message || 'Erro ao criar projeto',\n 'CREATE_PROJECT_FAILED',\n 400\n );\n }\n\n if (!response.data || response.data.length === 0) {\n throw new ApiError('Resposta inválida ao criar projeto', 'INVALID_RESPONSE', 500);\n }\n\n return ProjectSchema.parse(response.data[0]);\n }\n\n async update(projectId: number, data: UpdateProjectRequest): Promise<Project> {\n await assertManagementSubscription();\n const { id_account, id_user } = await getUserContext();\n const url = `/account/${id_account}/user/${id_user}/projects/${projectId}`;\n\n const response = await api.apps.put<ApiMutationResponse>(url, data);\n\n if (response.status === 0) {\n throw new ApiError(\n response.message || 'Erro ao atualizar projeto',\n 'UPDATE_PROJECT_FAILED',\n 400\n );\n }\n\n if (!response.data || response.data.length === 0) {\n throw new ApiError('Resposta inválida ao atualizar projeto', 'INVALID_RESPONSE', 500);\n }\n\n return ProjectSchema.parse(response.data[0]);\n }\n\n async delete(projectId: number, moveToProjectId: number): Promise<void> {\n await assertManagementSubscription();\n const { id_account, id_user } = await getUserContext();\n const url = `/account/${id_account}/user/${id_user}/projects/${projectId}`;\n\n const response = await api.apps.delete<ApiMutationResponse>(url, {\n body: JSON.stringify({ id_project_to_move: moveToProjectId }),\n });\n\n if (response.status === 0) {\n throw new ApiError(\n response.message || 'Erro ao deletar projeto',\n 'DELETE_PROJECT_FAILED',\n 400\n );\n }\n }\n}\n\nexport const projectsService = new ProjectsService();\n"],"mappings":"AAAA,OAAO;AAEP,SAAS,WAAW;AACpB,SAAS,gBAAgB;AACzB,SAAS,wBAAwB;AACjC,SAAS,sBAAsB;AAC/B,SAAS,oCAAoC;AAC7C;AAAA,EAEE;AAAA,OAIK;AAuBP,MAAM,gBAAgB;AAAA,EACpB,MAAM,KAAK,SAA6B,CAAC,GAA0B;AACjE,UAAM,EAAE,YAAY,QAAQ,IAAI,MAAM,eAAe;AACrD,UAAM,QAAQ,iBAAiB,MAA+D;AAC9F,UAAM,MAAM,YAAY,UAAU,SAAS,OAAO,YAAY,QAAQ,IAAI,KAAK,KAAK,EAAE;AAEtF,UAAM,WAAW,MAAM,IAAI,KAAK,IAA8B,GAAG;AAEjE,QAAI,SAAS,WAAW,GAAG;AACzB,YAAM,IAAI;AAAA,QACR,SAAS,WAAW;AAAA,QACpB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,WAAO;AAAA,MACL,OAAO,SAAS,QAAQ,CAAC,GAAG,IAAI,CAAC,SAAS,cAAc,MAAM,IAAI,CAAC;AAAA,MACnE,OAAO,SAAS,SAAS;AAAA,MACzB,MAAM,OAAO,QAAQ;AAAA,IACvB;AAAA,EACF;AAAA,EAEA,MAAM,OAAO,MAA8C;AACzD,UAAM,6BAA6B;AACnC,UAAM,EAAE,YAAY,QAAQ,IAAI,MAAM,eAAe;AACrD,UAAM,MAAM,YAAY,UAAU,SAAS,OAAO;AAElD,UAAM,WAAW,MAAM,IAAI,KAAK,KAA0B,KAAK,IAAI;AAEnE,QAAI,SAAS,WAAW,GAAG;AACzB,YAAM,IAAI;AAAA,QACR,SAAS,WAAW;AAAA,QACpB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,SAAS,QAAQ,SAAS,KAAK,WAAW,GAAG;AAChD,YAAM,IAAI,SAAS,yCAAsC,oBAAoB,GAAG;AAAA,IAClF;AAEA,WAAO,cAAc,MAAM,SAAS,KAAK,CAAC,CAAC;AAAA,EAC7C;AAAA,EAEA,MAAM,OAAO,WAAmB,MAA8C;AAC5E,UAAM,6BAA6B;AACnC,UAAM,EAAE,YAAY,QAAQ,IAAI,MAAM,eAAe;AACrD,UAAM,MAAM,YAAY,UAAU,SAAS,OAAO,aAAa,SAAS;AAExE,UAAM,WAAW,MAAM,IAAI,KAAK,IAAyB,KAAK,IAAI;AAElE,QAAI,SAAS,WAAW,GAAG;AACzB,YAAM,IAAI;AAAA,QACR,SAAS,WAAW;AAAA,QACpB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAEA,QAAI,CAAC,SAAS,QAAQ,SAAS,KAAK,WAAW,GAAG;AAChD,YAAM,IAAI,SAAS,6CAA0C,oBAAoB,GAAG;AAAA,IACtF;AAEA,WAAO,cAAc,MAAM,SAAS,KAAK,CAAC,CAAC;AAAA,EAC7C;AAAA,EAEA,MAAM,OAAO,WAAmB,iBAAwC;AACtE,UAAM,6BAA6B;AACnC,UAAM,EAAE,YAAY,QAAQ,IAAI,MAAM,eAAe;AACrD,UAAM,MAAM,YAAY,UAAU,SAAS,OAAO,aAAa,SAAS;AAExE,UAAM,WAAW,MAAM,IAAI,KAAK,OAA4B,KAAK;AAAA,MAC/D,MAAM,KAAK,UAAU,EAAE,oBAAoB,gBAAgB,CAAC;AAAA,IAC9D,CAAC;AAED,QAAI,SAAS,WAAW,GAAG;AACzB,YAAM,IAAI;AAAA,QACR,SAAS,WAAW;AAAA,QACpB;AAAA,QACA;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;AAEO,MAAM,kBAAkB,IAAI,gBAAgB;","names":[]}
@@ -1,4 +1,18 @@
1
1
  import { z } from "zod";
2
+ const ProjectSchema = z.object({
3
+ id: z.union([z.number(), z.string()]).transform(Number),
4
+ id_wl: z.union([z.number(), z.string()]).transform(Number),
5
+ id_account: z.union([z.number(), z.string()]).transform(Number),
6
+ title: z.string(),
7
+ photo: z.string().nullable().optional(),
8
+ id_api: z.union([z.number(), z.string()]).nullable().optional(),
9
+ id_form_integration: z.union([z.number(), z.string()]).nullable().optional(),
10
+ total_users: z.string().optional(),
11
+ deleted: z.union([z.boolean(), z.number()]).transform((v) => Boolean(v)).default(false),
12
+ datetime_add: z.string().nullable().optional(),
13
+ datetime_alt: z.string().nullable().optional(),
14
+ datetime_del: z.string().nullable().optional()
15
+ });
2
16
  const ProjectUserSchema = z.object({
3
17
  id_user: z.union([z.number(), z.string()]).transform(Number),
4
18
  id_account: z.union([z.number(), z.string()]).transform(Number),
@@ -18,6 +32,7 @@ const AccountUserSchema = z.object({
18
32
  });
19
33
  export {
20
34
  AccountUserSchema,
35
+ ProjectSchema,
21
36
  ProjectUserSchema
22
37
  };
23
38
  //# sourceMappingURL=types.mjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../src/modules/projects/types.ts"],"sourcesContent":["import { z } from \"zod\";\r\n\r\nexport const ProjectUserSchema = z.object({\r\n id_user: z.union([z.number(), z.string()]).transform(Number),\r\n id_account: z.union([z.number(), z.string()]).transform(Number),\r\n id_project: z.union([z.number(), z.string()]).transform(Number),\r\n name: z.string().nullable(),\r\n email: z.string().nullable(),\r\n profile: z.string().nullable().optional().default(\"viewer\"),\r\n photo: z.string().nullable().optional(),\r\n});\r\n\r\nexport type ProjectUser = z.infer<typeof ProjectUserSchema>;\r\n\r\nexport const AccountUserSchema = z.object({\r\n id: z.union([z.number(), z.string()]).transform(Number),\r\n name: z.string().nullable(),\r\n email: z.string().nullable(),\r\n profile: z.string().nullable().optional().default(\"viewer\"),\r\n photo: z.string().nullable().optional(),\r\n in_project: z.boolean().optional(),\r\n});\r\n\r\nexport type AccountUser = z.infer<typeof AccountUserSchema>;\r\n\r\nexport interface AddRemoveProjectUsersParams {\r\n projectId: number;\r\n users: number[];\r\n}\r\n\r\nexport interface ListUsersParams {\r\n search?: string;\r\n page?: number;\r\n limit?: number;\r\n inProject?: number;\r\n}\r\n\r\nexport interface UsersPage<T> {\r\n data: T[];\r\n total: number;\r\n page: number;\r\n}\r\n"],"mappings":"AAAA,SAAS,SAAS;AAEX,MAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,SAAS,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,UAAU,MAAM;AAAA,EAC3D,YAAY,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,UAAU,MAAM;AAAA,EAC9D,YAAY,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,UAAU,MAAM;AAAA,EAC9D,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,QAAQ;AAAA,EAC1D,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AACxC,CAAC;AAIM,MAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,IAAI,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,UAAU,MAAM;AAAA,EACtD,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,QAAQ;AAAA,EAC1D,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EACtC,YAAY,EAAE,QAAQ,EAAE,SAAS;AACnC,CAAC;","names":[]}
1
+ {"version":3,"sources":["../../../src/modules/projects/types.ts"],"sourcesContent":["import { z } from \"zod\";\r\n\r\n// ============================================================================\r\n// Project\r\n// ============================================================================\r\n\r\nexport const ProjectSchema = z.object({\r\n id: z.union([z.number(), z.string()]).transform(Number),\r\n id_wl: z.union([z.number(), z.string()]).transform(Number),\r\n id_account: z.union([z.number(), z.string()]).transform(Number),\r\n title: z.string(),\r\n photo: z.string().nullable().optional(),\r\n id_api: z.union([z.number(), z.string()]).nullable().optional(),\r\n id_form_integration: z.union([z.number(), z.string()]).nullable().optional(),\r\n total_users: z.string().optional(),\r\n deleted: z\r\n .union([z.boolean(), z.number()])\r\n .transform((v) => Boolean(v))\r\n .default(false),\r\n datetime_add: z.string().nullable().optional(),\r\n datetime_alt: z.string().nullable().optional(),\r\n datetime_del: z.string().nullable().optional(),\r\n});\r\n\r\nexport type Project = z.infer<typeof ProjectSchema>;\r\n\r\nexport interface ProjectsPage {\r\n data: Project[];\r\n total: number;\r\n page: number;\r\n}\r\n\r\nexport interface CreateProjectRequest {\r\n title: string;\r\n photo?: string;\r\n id_api?: number;\r\n users?: number[];\r\n}\r\n\r\nexport interface UpdateProjectRequest {\r\n title: string;\r\n photo?: string;\r\n}\r\n\r\n// ============================================================================\r\n// Project Users\r\n// ============================================================================\r\n\r\nexport const ProjectUserSchema = z.object({\r\n id_user: z.union([z.number(), z.string()]).transform(Number),\r\n id_account: z.union([z.number(), z.string()]).transform(Number),\r\n id_project: z.union([z.number(), z.string()]).transform(Number),\r\n name: z.string().nullable(),\r\n email: z.string().nullable(),\r\n profile: z.string().nullable().optional().default(\"viewer\"),\r\n photo: z.string().nullable().optional(),\r\n});\r\n\r\nexport type ProjectUser = z.infer<typeof ProjectUserSchema>;\r\n\r\nexport const AccountUserSchema = z.object({\r\n id: z.union([z.number(), z.string()]).transform(Number),\r\n name: z.string().nullable(),\r\n email: z.string().nullable(),\r\n profile: z.string().nullable().optional().default(\"viewer\"),\r\n photo: z.string().nullable().optional(),\r\n in_project: z.boolean().optional(),\r\n});\r\n\r\nexport type AccountUser = z.infer<typeof AccountUserSchema>;\r\n\r\nexport interface AddRemoveProjectUsersParams {\r\n projectId: number;\r\n users: number[];\r\n}\r\n\r\nexport interface ListUsersParams {\r\n search?: string;\r\n page?: number;\r\n limit?: number;\r\n inProject?: number;\r\n}\r\n\r\nexport interface UsersPage<T> {\r\n data: T[];\r\n total: number;\r\n page: number;\r\n}\r\n"],"mappings":"AAAA,SAAS,SAAS;AAMX,MAAM,gBAAgB,EAAE,OAAO;AAAA,EACpC,IAAI,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,UAAU,MAAM;AAAA,EACtD,OAAO,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,UAAU,MAAM;AAAA,EACzD,YAAY,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,UAAU,MAAM;AAAA,EAC9D,OAAO,EAAE,OAAO;AAAA,EAChB,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EACtC,QAAQ,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS;AAAA,EAC9D,qBAAqB,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,SAAS,EAAE,SAAS;AAAA,EAC3E,aAAa,EAAE,OAAO,EAAE,SAAS;AAAA,EACjC,SAAS,EACN,MAAM,CAAC,EAAE,QAAQ,GAAG,EAAE,OAAO,CAAC,CAAC,EAC/B,UAAU,CAAC,MAAM,QAAQ,CAAC,CAAC,EAC3B,QAAQ,KAAK;AAAA,EAChB,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC7C,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EAC7C,cAAc,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAC/C,CAAC;AA0BM,MAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,SAAS,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,UAAU,MAAM;AAAA,EAC3D,YAAY,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,UAAU,MAAM;AAAA,EAC9D,YAAY,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,UAAU,MAAM;AAAA,EAC9D,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,QAAQ;AAAA,EAC1D,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AACxC,CAAC;AAIM,MAAM,oBAAoB,EAAE,OAAO;AAAA,EACxC,IAAI,EAAE,MAAM,CAAC,EAAE,OAAO,GAAG,EAAE,OAAO,CAAC,CAAC,EAAE,UAAU,MAAM;AAAA,EACtD,MAAM,EAAE,OAAO,EAAE,SAAS;AAAA,EAC1B,OAAO,EAAE,OAAO,EAAE,SAAS;AAAA,EAC3B,SAAS,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS,EAAE,QAAQ,QAAQ;AAAA,EAC1D,OAAO,EAAE,OAAO,EAAE,SAAS,EAAE,SAAS;AAAA,EACtC,YAAY,EAAE,QAAQ,EAAE,SAAS;AACnC,CAAC;","names":[]}
package/dist/server.mjs CHANGED
@@ -25,6 +25,11 @@ import { createCardAction } from "./modules/cards/actions/create-card.action";
25
25
  import { resolvePlanExtrasPrices } from "./modules/subscriptions/utils/resolve-plan-extras-prices";
26
26
  import { hasSubscriptionExpired } from "./modules/subscriptions/utils/has-subscription-expired";
27
27
  import { listIaCreditsAction } from "./modules/ia-credits/actions/list-ia-credits.action";
28
+ import { projectsService } from "./modules/projects/services/projects.service";
29
+ import { listProjectsAction } from "./modules/projects/actions/list-projects.action";
30
+ import { createProjectAction } from "./modules/projects/actions/create-project.action";
31
+ import { updateProjectAction } from "./modules/projects/actions/update-project.action";
32
+ import { deleteProjectAction } from "./modules/projects/actions/delete-project.action";
28
33
  import { projectUsersService } from "./modules/projects/services/project-users.service";
29
34
  import { listProjectUsersAction } from "./modules/projects/actions/list-project-users.action";
30
35
  import { listAvailableUsersAction } from "./modules/projects/actions/list-available-users.action";
@@ -76,8 +81,10 @@ export {
76
81
  confirmTwoFactorAction,
77
82
  createAccountUserAction,
78
83
  createCardAction,
84
+ createProjectAction,
79
85
  deleteAccountAction,
80
86
  deleteAccountUserAction,
87
+ deleteProjectAction,
81
88
  disableTwoFactorAction,
82
89
  findCurrentAccount,
83
90
  findPlanByIdAction,
@@ -94,11 +101,13 @@ export {
94
101
  listIaCreditsAction,
95
102
  listPlansAction,
96
103
  listProjectUsersAction,
104
+ listProjectsAction,
97
105
  listSubscriptionsAction,
98
106
  plansService,
99
107
  processImage,
100
108
  processImageAction,
101
109
  projectUsersService,
110
+ projectsService,
102
111
  removeProjectUserAction,
103
112
  requestEmailChangeAction,
104
113
  requestPhoneChangeAction,
@@ -109,6 +118,7 @@ export {
109
118
  twoFactorService,
110
119
  updateAccountAction,
111
120
  updateAccountUserByIdAction,
121
+ updateProjectAction,
112
122
  updateSubscriptionPlanAction,
113
123
  updateUserAction,
114
124
  validateSessionAction,
@@ -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 { 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 { findUserById } from './modules/users/action/find-user-by-id.action';\r\nexport { findCurrentAccount } from './modules/accounts/actions/find-current-account.action';\r\nexport { listSubscriptionsAction } from './modules/subscriptions/actions/list-subscriptions.action';\r\nexport { findPlanByIdAction } from './modules/plans/actions/find-plan-by-id.action';\r\nexport { listPlansAction } from './modules/plans/actions/list-plans.action';\r\nexport { calculateSubscriptionAction } from './modules/subscriptions/actions/calculate-subscription.action';\r\nexport { updateSubscriptionPlanAction } from './modules/subscriptions/actions/update-subscription-plan.action';\r\nexport { listCardsAction } from './modules/cards/actions/list-cards.action';\r\nexport { createCardAction } from './modules/cards/actions/create-card.action';\r\nexport { resolvePlanExtrasPrices } from './modules/subscriptions/utils/resolve-plan-extras-prices';\r\nexport { hasSubscriptionExpired } from './modules/subscriptions/utils/has-subscription-expired';\r\nexport { listIaCreditsAction } from './modules/ia-credits/actions/list-ia-credits.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 { listAvailableUsersAction } from './modules/projects/actions/list-available-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 { buildWlOverride, buildWlOverrideFromJwt } from './modules/auth/utils/build-wl-override';\r\nexport { safeServerAction } from './utils/safeServerAction';\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,wBAAwB;AAGjC,SAAS,sBAAsB;AAC/B,SAAS,6BAA6B;AACtC,SAAS,oBAAoB;AAC7B,SAAS,0BAA0B;AACnC,SAAS,+BAA+B;AACxC,SAAS,0BAA0B;AACnC,SAAS,uBAAuB;AAChC,SAAS,mCAAmC;AAC5C,SAAS,oCAAoC;AAC7C,SAAS,uBAAuB;AAChC,SAAS,wBAAwB;AACjC,SAAS,+BAA+B;AACxC,SAAS,8BAA8B;AACvC,SAAS,2BAA2B;AAGpC,SAAS,2BAA2B;AACpC,SAAS,8BAA8B;AACvC,SAAS,gCAAgC;AACzC,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,iBAAiB,8BAA8B;AACxD,SAAS,wBAAwB;AAGjC,SAAS,0BAA0B;AACnC,SAAS,oBAAoB;","names":[]}
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 { 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 { findUserById } from './modules/users/action/find-user-by-id.action';\r\nexport { findCurrentAccount } from './modules/accounts/actions/find-current-account.action';\r\nexport { listSubscriptionsAction } from './modules/subscriptions/actions/list-subscriptions.action';\r\nexport { findPlanByIdAction } from './modules/plans/actions/find-plan-by-id.action';\r\nexport { listPlansAction } from './modules/plans/actions/list-plans.action';\r\nexport { calculateSubscriptionAction } from './modules/subscriptions/actions/calculate-subscription.action';\r\nexport { updateSubscriptionPlanAction } from './modules/subscriptions/actions/update-subscription-plan.action';\r\nexport { listCardsAction } from './modules/cards/actions/list-cards.action';\r\nexport { createCardAction } from './modules/cards/actions/create-card.action';\r\nexport { resolvePlanExtrasPrices } from './modules/subscriptions/utils/resolve-plan-extras-prices';\r\nexport { hasSubscriptionExpired } from './modules/subscriptions/utils/has-subscription-expired';\r\nexport { listIaCreditsAction } from './modules/ia-credits/actions/list-ia-credits.action';\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 { 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 { listAvailableUsersAction } from './modules/projects/actions/list-available-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 { buildWlOverride, buildWlOverrideFromJwt } from './modules/auth/utils/build-wl-override';\r\nexport { safeServerAction } from './utils/safeServerAction';\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,wBAAwB;AAGjC,SAAS,sBAAsB;AAC/B,SAAS,6BAA6B;AACtC,SAAS,oBAAoB;AAC7B,SAAS,0BAA0B;AACnC,SAAS,+BAA+B;AACxC,SAAS,0BAA0B;AACnC,SAAS,uBAAuB;AAChC,SAAS,mCAAmC;AAC5C,SAAS,oCAAoC;AAC7C,SAAS,uBAAuB;AAChC,SAAS,wBAAwB;AACjC,SAAS,+BAA+B;AACxC,SAAS,8BAA8B;AACvC,SAAS,2BAA2B;AAGpC,SAAS,uBAAuB;AAChC,SAAS,0BAA0B;AACnC,SAAS,2BAA2B;AACpC,SAAS,2BAA2B;AACpC,SAAS,2BAA2B;AAGpC,SAAS,2BAA2B;AACpC,SAAS,8BAA8B;AACvC,SAAS,gCAAgC;AACzC,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,iBAAiB,8BAA8B;AACxD,SAAS,wBAAwB;AAGjC,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.492",
3
+ "version": "1.1.495",
4
4
  "description": "Shared library for GreatApps frontend applications",
5
5
  "main": "./dist/index.mjs",
6
6
  "types": "./src/index.ts",
@@ -1,16 +1,15 @@
1
1
  "use client";
2
2
 
3
- import { useRouter } from "next/navigation";
4
3
  import { NavBar } from "./NavBar";
5
4
  import { ProfilePopover } from "./ProfilePopover";
6
5
  import { NotificationsPopover } from "./NotificationsPopover";
7
6
  import type { ProfileMenuItem } from "./ProfilePopover";
8
7
 
9
8
  export interface AppNavBarProps {
10
- onLogoClick?: () => void;
9
+ logoHref: string;
10
+ appIconHref: string;
11
11
  /** Which app is currently active — controls which icon gets the indicator */
12
12
  activeApp?: "gapps" | "gpages";
13
- appIconHref?: string;
14
13
  showExpandButton?: boolean;
15
14
  onExpandClick?: () => void;
16
15
  menuItems?: ProfileMenuItem[];
@@ -18,23 +17,18 @@ export interface AppNavBarProps {
18
17
  }
19
18
 
20
19
  export function AppNavBar({
21
- onLogoClick,
20
+ logoHref,
21
+ appIconHref,
22
22
  activeApp,
23
- appIconHref = "/",
24
23
  showExpandButton = false,
25
24
  onExpandClick,
26
25
  menuItems = [],
27
26
  onNotificationsViewAll,
28
27
  }: AppNavBarProps) {
29
- const router = useRouter();
30
-
31
- const handleLogoClick = onLogoClick ?? (() => router.push("/"));
32
- const handleAppIconClick = () => router.push(appIconHref);
33
-
34
28
  return (
35
29
  <NavBar
36
- onLogoClick={handleLogoClick}
37
- onAppIconClick={handleAppIconClick}
30
+ logoHref={logoHref}
31
+ appIconHref={appIconHref}
38
32
  activeApp={activeApp}
39
33
  showExpandButton={showExpandButton}
40
34
  onExpandClick={onExpandClick}
@@ -2,6 +2,7 @@
2
2
 
3
3
  import * as React from "react";
4
4
  import Image from "next/image";
5
+ import Link from "next/link";
5
6
  import { IconChevronRight } from "@tabler/icons-react";
6
7
  import { Separator } from "../ui/data-display/Separator";
7
8
  import { Tooltip, TooltipContent, TooltipTrigger } from "../ui/overlay/Tooltip";
@@ -10,8 +11,8 @@ import { useWhitelabel, useIsDefaultWhitelabel } from "../../providers/whitelabe
10
11
  import { cn } from "../../infra/utils/clsx";
11
12
 
12
13
  type NavBarProps = {
13
- onLogoClick: () => void;
14
- onAppIconClick?: () => void;
14
+ logoHref: string;
15
+ appIconHref: string;
15
16
  activeApp?: "gapps" | "gpages";
16
17
  showExpandButton?: boolean;
17
18
  onExpandClick?: () => void;
@@ -20,8 +21,8 @@ type NavBarProps = {
20
21
  };
21
22
 
22
23
  function NavBar({
23
- onLogoClick,
24
- onAppIconClick,
24
+ logoHref,
25
+ appIconHref,
25
26
  activeApp,
26
27
  showExpandButton = false,
27
28
  onExpandClick,
@@ -50,28 +51,29 @@ function NavBar({
50
51
  <TooltipTrigger
51
52
  className="cursor-pointer"
52
53
  asChild
53
- onClick={onLogoClick}
54
54
  >
55
- {isDefaultWl ? (
56
- <Image
57
- src="/icons/great-icon.svg"
58
- alt="Great Icon"
59
- width={28}
60
- height={28}
61
- />
62
- ) : (
63
- <div
64
- className={cn("size-10 rounded-lg flex items-center justify-center transition-opacity duration-300", activeApp !== "gapps" && "opacity-20")}
65
- style={{ backgroundColor: primaryColor }}
66
- >
67
- <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="white" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
68
- <path d="M4 5a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v4a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1l0 -4" />
69
- <path d="M14 5a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v4a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1l0 -4" />
70
- <path d="M4 15a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v4a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1l0 -4" />
71
- <path d="M14 15a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v4a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1l0 -4" />
72
- </svg>
73
- </div>
74
- )}
55
+ <Link href={logoHref}>
56
+ {isDefaultWl ? (
57
+ <Image
58
+ src="/icons/great-icon.svg"
59
+ alt="Great Icon"
60
+ width={28}
61
+ height={28}
62
+ />
63
+ ) : (
64
+ <div
65
+ className={cn("size-10 rounded-lg flex items-center justify-center transition-opacity duration-300", activeApp !== "gapps" && "opacity-20")}
66
+ style={{ backgroundColor: primaryColor }}
67
+ >
68
+ <svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="white" strokeWidth="2" strokeLinecap="round" strokeLinejoin="round">
69
+ <path d="M4 5a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v4a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1l0 -4" />
70
+ <path d="M14 5a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v4a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1l0 -4" />
71
+ <path d="M4 15a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v4a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1l0 -4" />
72
+ <path d="M14 15a1 1 0 0 1 1 -1h4a1 1 0 0 1 1 1v4a1 1 0 0 1 -1 1h-4a1 1 0 0 1 -1 -1l0 -4" />
73
+ </svg>
74
+ </div>
75
+ )}
76
+ </Link>
75
77
  </TooltipTrigger>
76
78
  <TooltipContent side="right">{wlName}</TooltipContent>
77
79
  </Tooltip>
@@ -120,8 +122,9 @@ function NavBar({
120
122
  {/* GreatPages icon */}
121
123
  <div className="relative">
122
124
  <Tooltip>
123
- <TooltipTrigger asChild onClick={onAppIconClick}>
124
- <div
125
+ <TooltipTrigger asChild>
126
+ <Link
127
+ href={appIconHref}
125
128
  className={cn(
126
129
  "size-10 rounded-lg cursor-pointer flex items-center justify-center border-2 ring-2 transition-colors duration-300",
127
130
  activeApp === "gpages"
@@ -148,7 +151,7 @@ function NavBar({
148
151
  <path d="M8 4v4" />
149
152
  </svg>
150
153
  )}
151
- </div>
154
+ </Link>
152
155
  </TooltipTrigger>
153
156
  <TooltipContent side="right">{isDefaultWl ? 'GreatPages' : 'Páginas'}</TooltipContent>
154
157
  </Tooltip>
@@ -14,20 +14,19 @@ import {
14
14
  UserAvatar,
15
15
  } from '../../index';
16
16
  import { IconCheck, IconChevronDown, IconFolderOpen } from '@tabler/icons-react';
17
- import type { NavigationProject } from './types';
17
+ import type { Project } from '../../modules/projects/types';
18
18
 
19
- interface ProjectSelectorPopoverProps {
19
+ export interface ProjectSelectorPopoverProps {
20
20
  open: boolean;
21
21
  setOpen: Dispatch<SetStateAction<boolean>>;
22
22
  titleRef?: RefObject<HTMLSpanElement | null>;
23
- projects: NavigationProject[];
24
- selectedProject: NavigationProject | null;
23
+ projects: Project[];
24
+ selectedProject: Project | null;
25
25
  isLoading?: boolean;
26
26
  isFetchingNextPage?: boolean;
27
27
  hasNextPage?: boolean;
28
28
  onLoadMore?: () => void | Promise<unknown>;
29
- onSelectProject: (project: NavigationProject) => void;
30
- onAddProject?: () => void;
29
+ onSelectProject: (project: Project) => void;
31
30
  onManageProjects?: () => void;
32
31
  children?: React.ReactNode;
33
32
  }
@@ -55,7 +54,6 @@ export function ProjectSelectorPopover({
55
54
  hasNextPage,
56
55
  onLoadMore,
57
56
  onSelectProject,
58
- onAddProject,
59
57
  onManageProjects,
60
58
  children,
61
59
  }: ProjectSelectorPopoverProps) {