@pfm-platform/partners-data-access 0.1.1

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/index.cjs ADDED
@@ -0,0 +1,101 @@
1
+ 'use strict';
2
+
3
+ var reactQuery = require('@tanstack/react-query');
4
+ var shared = require('@pfm-platform/shared');
5
+ var axios = require('axios');
6
+
7
+ function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
8
+
9
+ var axios__default = /*#__PURE__*/_interopDefault(axios);
10
+
11
+ // src/queries/useCurrentPartner.ts
12
+ var api = axios__default.default.create({
13
+ baseURL: "/api",
14
+ headers: {
15
+ "Content-Type": "application/json"
16
+ }
17
+ });
18
+
19
+ // src/keys.ts
20
+ var partnerKeys = {
21
+ all: ["partners"],
22
+ current: () => [...partnerKeys.all, "current"]
23
+ };
24
+
25
+ // src/queries/useCurrentPartner.ts
26
+ function useCurrentPartner(options) {
27
+ return reactQuery.useQuery({
28
+ queryKey: partnerKeys.current(),
29
+ queryFn: async () => {
30
+ const response = await api.get("/partners/current");
31
+ const validated = shared.PartnersResponseSchema.parse(response.data);
32
+ if (validated.partners.length === 0) {
33
+ throw new Error("No current partner configuration found");
34
+ }
35
+ return validated.partners[0];
36
+ },
37
+ staleTime: 1e3 * 60 * 60 * 24,
38
+ // 24 hours (partner config rarely changes)
39
+ ...options
40
+ });
41
+ }
42
+ function useCreatePartner(options) {
43
+ const queryClient = reactQuery.useQueryClient();
44
+ const { mode } = shared.useAppMode();
45
+ return reactQuery.useMutation({
46
+ mutationFn: async ({ data }) => {
47
+ const schema = mode === "admin" ? shared.PartnerCreateSchemaAdmin : shared.PartnerCreateSchemaUser;
48
+ const validated = schema.parse(data);
49
+ const response = await api.post("/partners/current", validated);
50
+ return shared.PartnerSchema.parse(response.data);
51
+ },
52
+ onSuccess: () => {
53
+ queryClient.invalidateQueries({
54
+ queryKey: partnerKeys.current()
55
+ });
56
+ },
57
+ ...options
58
+ });
59
+ }
60
+ function useUpdatePartner(options) {
61
+ const queryClient = reactQuery.useQueryClient();
62
+ const { mode } = shared.useAppMode();
63
+ return reactQuery.useMutation({
64
+ mutationFn: async ({ partnerId, data }) => {
65
+ const schema = mode === "admin" ? shared.PartnerUpdateSchemaAdmin : shared.PartnerUpdateSchemaUser;
66
+ const validated = schema.parse(data);
67
+ const response = await api.put(`/partners/${partnerId}`, validated);
68
+ return shared.PartnerSchema.parse(response.data);
69
+ },
70
+ onSuccess: () => {
71
+ queryClient.invalidateQueries({
72
+ queryKey: partnerKeys.current()
73
+ });
74
+ },
75
+ ...options
76
+ });
77
+ }
78
+ function useDeletePartner(options) {
79
+ const queryClient = reactQuery.useQueryClient();
80
+ return reactQuery.useMutation({
81
+ mutationFn: async ({ partnerId }) => {
82
+ const validated = shared.PartnerDeleteSchema.parse({ id: partnerId });
83
+ await api.delete(`/partners/${validated.id}`);
84
+ },
85
+ onSuccess: () => {
86
+ queryClient.invalidateQueries({
87
+ queryKey: partnerKeys.current()
88
+ });
89
+ },
90
+ ...options
91
+ });
92
+ }
93
+
94
+ exports.api = api;
95
+ exports.partnerKeys = partnerKeys;
96
+ exports.useCreatePartner = useCreatePartner;
97
+ exports.useCurrentPartner = useCurrentPartner;
98
+ exports.useDeletePartner = useDeletePartner;
99
+ exports.useUpdatePartner = useUpdatePartner;
100
+ //# sourceMappingURL=index.cjs.map
101
+ //# sourceMappingURL=index.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client.ts","../src/keys.ts","../src/queries/useCurrentPartner.ts","../src/mutations/useCreatePartner.ts","../src/mutations/useUpdatePartner.ts","../src/mutations/useDeletePartner.ts"],"names":["axios","useQuery","PartnersResponseSchema","useQueryClient","useAppMode","useMutation","PartnerCreateSchemaAdmin","PartnerCreateSchemaUser","PartnerSchema","PartnerUpdateSchemaAdmin","PartnerUpdateSchemaUser","PartnerDeleteSchema"],"mappings":"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","file":"index.cjs","sourcesContent":["import axios from 'axios';\n\n/**\n * Axios instance for Partners API\n * Base URL configured through environment variables or defaults to relative path\n */\nexport const api = axios.create({\n baseURL: '/api',\n headers: {\n 'Content-Type': 'application/json',\n },\n});\n","/**\n * Query key factory for Partners domain\n */\nexport const partnerKeys = {\n all: ['partners'] as const,\n current: () => [...partnerKeys.all, 'current'] as const,\n};\n","import { useQuery, UseQueryOptions } from '@tanstack/react-query';\nimport { Partner, PartnersResponseSchema } from '@pfm-platform/shared';\nimport { api } from '../client.js';\nimport { partnerKeys } from '../keys.js';\n\n/**\n * Fetch current partner configuration\n * GET /partners/current\n *\n * Partners are read-only configuration data\n * Typically returns single partner (current tenant/white-label configuration)\n */\nexport function useCurrentPartner(\n options?: Omit<UseQueryOptions<Partner>, 'queryKey' | 'queryFn'>\n) {\n return useQuery({\n queryKey: partnerKeys.current(),\n queryFn: async () => {\n const response = await api.get('/partners/current');\n const validated = PartnersResponseSchema.parse(response.data);\n // Return first partner (current partner configuration)\n if (validated.partners.length === 0) {\n throw new Error('No current partner configuration found');\n }\n return validated.partners[0];\n },\n staleTime: 1000 * 60 * 60 * 24, // 24 hours (partner config rarely changes)\n ...options,\n });\n}\n","import {\n useMutation,\n useQueryClient,\n type UseMutationOptions,\n} from '@tanstack/react-query';\nimport {\n PartnerCreateSchemaAdmin,\n PartnerCreateSchemaUser,\n PartnerSchema,\n useAppMode,\n} from '@pfm-platform/shared';\nimport type { Partner } from '@pfm-platform/shared';\nimport { api } from '../client';\nimport { partnerKeys } from '../keys';\n\n/**\n * Partner create data interface\n */\nexport interface PartnerCreate {\n domain: string;\n product_name: string;\n browser_title: string;\n partner_alerts_enabled?: boolean;\n demo?: boolean;\n modules?: Record<string, unknown>;\n featured_searches?: unknown[];\n}\n\n/**\n * Parameters for useCreatePartner mutation\n */\nexport interface CreatePartnerParams {\n data: PartnerCreate;\n}\n\n/**\n * Mutation hook for creating a new partner\n *\n * Creates a partner manually for testing purposes.\n * Uses mode switching for validation:\n * - Admin mode: Allows manual partner creation for test data\n * - User mode: Blocked (partners are configuration data)\n *\n * @example\n * ```tsx\n * const createPartner = useCreatePartner();\n *\n * createPartner.mutate({\n * data: {\n * domain: 'example.com',\n * product_name: 'Example Product',\n * browser_title: 'Example',\n * demo: true\n * }\n * });\n * ```\n */\nexport function useCreatePartner(\n options?: Omit<UseMutationOptions<Partner, Error, CreatePartnerParams>, 'mutationFn'>\n) {\n const queryClient = useQueryClient();\n const { mode } = useAppMode();\n\n return useMutation({\n mutationFn: async ({ data }: CreatePartnerParams) => {\n // Select schema based on mode\n const schema =\n mode === 'admin'\n ? PartnerCreateSchemaAdmin\n : PartnerCreateSchemaUser;\n\n // Validate partner data\n const validated = schema.parse(data);\n\n // POST to create new partner\n const response = await api.post('/partners/current', validated);\n\n // Return created partner\n return PartnerSchema.parse(response.data);\n },\n onSuccess: () => {\n // Invalidate partner query to refetch updated data\n queryClient.invalidateQueries({\n queryKey: partnerKeys.current(),\n });\n },\n ...options,\n });\n}\n","import {\n useMutation,\n useQueryClient,\n type UseMutationOptions,\n} from '@tanstack/react-query';\nimport {\n PartnerUpdateSchemaAdmin,\n PartnerUpdateSchemaUser,\n PartnerSchema,\n useAppMode,\n} from '@pfm-platform/shared';\nimport type { Partner } from '@pfm-platform/shared';\nimport { api } from '../client';\nimport { partnerKeys } from '../keys';\n\n/**\n * Partner update data interface\n */\nexport interface PartnerUpdate {\n domain?: string;\n product_name?: string;\n browser_title?: string;\n partner_alerts_enabled?: boolean;\n demo?: boolean;\n modules?: Record<string, unknown>;\n featured_searches?: unknown[];\n}\n\n/**\n * Parameters for useUpdatePartner mutation\n */\nexport interface UpdatePartnerParams {\n partnerId: number;\n data: PartnerUpdate;\n}\n\n/**\n * Mutation hook for updating a partner\n *\n * Updates partner fields for testing purposes.\n * Uses mode switching for validation:\n * - Admin mode: Allows updating partners for test scenarios\n * - User mode: Blocked (partners are configuration data)\n *\n * @example\n * ```tsx\n * const updatePartner = useUpdatePartner();\n *\n * updatePartner.mutate({\n * partnerId: 1,\n * data: {\n * product_name: 'Updated Product Name'\n * }\n * });\n * ```\n */\nexport function useUpdatePartner(\n options?: Omit<UseMutationOptions<Partner, Error, UpdatePartnerParams>, 'mutationFn'>\n) {\n const queryClient = useQueryClient();\n const { mode } = useAppMode();\n\n return useMutation({\n mutationFn: async ({ partnerId, data }: UpdatePartnerParams) => {\n // Select schema based on mode\n const schema =\n mode === 'admin'\n ? PartnerUpdateSchemaAdmin\n : PartnerUpdateSchemaUser;\n\n // Validate partner update data\n const validated = schema.parse(data);\n\n // PUT to update partner\n const response = await api.put(`/partners/${partnerId}`, validated);\n\n // Return updated partner\n return PartnerSchema.parse(response.data);\n },\n onSuccess: () => {\n // Invalidate partner query to refetch updated data\n queryClient.invalidateQueries({\n queryKey: partnerKeys.current(),\n });\n },\n ...options,\n });\n}\n","import {\n useMutation,\n useQueryClient,\n type UseMutationOptions,\n} from '@tanstack/react-query';\nimport { PartnerDeleteSchema } from '@pfm-platform/shared';\nimport { api } from '../client';\nimport { partnerKeys } from '../keys';\n\n/**\n * Parameters for useDeletePartner mutation\n */\nexport interface DeletePartnerParams {\n partnerId: number;\n}\n\n/**\n * Mutation hook for deleting a partner\n *\n * Deletes a partner from the system.\n * Available in both admin and user modes (for test data cleanup).\n *\n * @example\n * ```tsx\n * const deletePartner = useDeletePartner();\n *\n * deletePartner.mutate({\n * partnerId: 1\n * });\n * ```\n */\nexport function useDeletePartner(\n options?: Omit<UseMutationOptions<void, Error, DeletePartnerParams>, 'mutationFn'>\n) {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async ({ partnerId }: DeletePartnerParams) => {\n // Validate partner ID\n const validated = PartnerDeleteSchema.parse({ id: partnerId });\n\n // DELETE partner\n await api.delete(`/partners/${validated.id}`);\n },\n onSuccess: () => {\n // Invalidate partner query to refetch updated list\n queryClient.invalidateQueries({\n queryKey: partnerKeys.current(),\n });\n },\n ...options,\n });\n}\n"]}
@@ -0,0 +1,168 @@
1
+ import * as _tanstack_react_query from '@tanstack/react-query';
2
+ import { UseQueryOptions, UseMutationOptions } from '@tanstack/react-query';
3
+ import { Partner } from '@pfm-platform/shared';
4
+ import * as axios from 'axios';
5
+
6
+ /**
7
+ * Fetch current partner configuration
8
+ * GET /partners/current
9
+ *
10
+ * Partners are read-only configuration data
11
+ * Typically returns single partner (current tenant/white-label configuration)
12
+ */
13
+ declare function useCurrentPartner(options?: Omit<UseQueryOptions<Partner>, 'queryKey' | 'queryFn'>): _tanstack_react_query.UseQueryResult<{
14
+ id: number;
15
+ domain: string;
16
+ product_name: string;
17
+ browser_title: string;
18
+ partner_alerts_enabled: boolean;
19
+ demo: boolean;
20
+ modules: {
21
+ [x: string]: unknown;
22
+ };
23
+ featured_searches: unknown[];
24
+ }, Error>;
25
+
26
+ /**
27
+ * Partner create data interface
28
+ */
29
+ interface PartnerCreate {
30
+ domain: string;
31
+ product_name: string;
32
+ browser_title: string;
33
+ partner_alerts_enabled?: boolean;
34
+ demo?: boolean;
35
+ modules?: Record<string, unknown>;
36
+ featured_searches?: unknown[];
37
+ }
38
+ /**
39
+ * Parameters for useCreatePartner mutation
40
+ */
41
+ interface CreatePartnerParams {
42
+ data: PartnerCreate;
43
+ }
44
+ /**
45
+ * Mutation hook for creating a new partner
46
+ *
47
+ * Creates a partner manually for testing purposes.
48
+ * Uses mode switching for validation:
49
+ * - Admin mode: Allows manual partner creation for test data
50
+ * - User mode: Blocked (partners are configuration data)
51
+ *
52
+ * @example
53
+ * ```tsx
54
+ * const createPartner = useCreatePartner();
55
+ *
56
+ * createPartner.mutate({
57
+ * data: {
58
+ * domain: 'example.com',
59
+ * product_name: 'Example Product',
60
+ * browser_title: 'Example',
61
+ * demo: true
62
+ * }
63
+ * });
64
+ * ```
65
+ */
66
+ declare function useCreatePartner(options?: Omit<UseMutationOptions<Partner, Error, CreatePartnerParams>, 'mutationFn'>): _tanstack_react_query.UseMutationResult<{
67
+ id: number;
68
+ domain: string;
69
+ product_name: string;
70
+ browser_title: string;
71
+ partner_alerts_enabled: boolean;
72
+ demo: boolean;
73
+ modules: {
74
+ [x: string]: unknown;
75
+ };
76
+ featured_searches: unknown[];
77
+ }, Error, CreatePartnerParams, unknown>;
78
+
79
+ /**
80
+ * Partner update data interface
81
+ */
82
+ interface PartnerUpdate {
83
+ domain?: string;
84
+ product_name?: string;
85
+ browser_title?: string;
86
+ partner_alerts_enabled?: boolean;
87
+ demo?: boolean;
88
+ modules?: Record<string, unknown>;
89
+ featured_searches?: unknown[];
90
+ }
91
+ /**
92
+ * Parameters for useUpdatePartner mutation
93
+ */
94
+ interface UpdatePartnerParams {
95
+ partnerId: number;
96
+ data: PartnerUpdate;
97
+ }
98
+ /**
99
+ * Mutation hook for updating a partner
100
+ *
101
+ * Updates partner fields for testing purposes.
102
+ * Uses mode switching for validation:
103
+ * - Admin mode: Allows updating partners for test scenarios
104
+ * - User mode: Blocked (partners are configuration data)
105
+ *
106
+ * @example
107
+ * ```tsx
108
+ * const updatePartner = useUpdatePartner();
109
+ *
110
+ * updatePartner.mutate({
111
+ * partnerId: 1,
112
+ * data: {
113
+ * product_name: 'Updated Product Name'
114
+ * }
115
+ * });
116
+ * ```
117
+ */
118
+ declare function useUpdatePartner(options?: Omit<UseMutationOptions<Partner, Error, UpdatePartnerParams>, 'mutationFn'>): _tanstack_react_query.UseMutationResult<{
119
+ id: number;
120
+ domain: string;
121
+ product_name: string;
122
+ browser_title: string;
123
+ partner_alerts_enabled: boolean;
124
+ demo: boolean;
125
+ modules: {
126
+ [x: string]: unknown;
127
+ };
128
+ featured_searches: unknown[];
129
+ }, Error, UpdatePartnerParams, unknown>;
130
+
131
+ /**
132
+ * Parameters for useDeletePartner mutation
133
+ */
134
+ interface DeletePartnerParams {
135
+ partnerId: number;
136
+ }
137
+ /**
138
+ * Mutation hook for deleting a partner
139
+ *
140
+ * Deletes a partner from the system.
141
+ * Available in both admin and user modes (for test data cleanup).
142
+ *
143
+ * @example
144
+ * ```tsx
145
+ * const deletePartner = useDeletePartner();
146
+ *
147
+ * deletePartner.mutate({
148
+ * partnerId: 1
149
+ * });
150
+ * ```
151
+ */
152
+ declare function useDeletePartner(options?: Omit<UseMutationOptions<void, Error, DeletePartnerParams>, 'mutationFn'>): _tanstack_react_query.UseMutationResult<void, Error, DeletePartnerParams, unknown>;
153
+
154
+ /**
155
+ * Query key factory for Partners domain
156
+ */
157
+ declare const partnerKeys: {
158
+ all: readonly ["partners"];
159
+ current: () => readonly ["partners", "current"];
160
+ };
161
+
162
+ /**
163
+ * Axios instance for Partners API
164
+ * Base URL configured through environment variables or defaults to relative path
165
+ */
166
+ declare const api: axios.AxiosInstance;
167
+
168
+ export { type CreatePartnerParams, type DeletePartnerParams, type PartnerCreate, type PartnerUpdate, type UpdatePartnerParams, api, partnerKeys, useCreatePartner, useCurrentPartner, useDeletePartner, useUpdatePartner };
@@ -0,0 +1,168 @@
1
+ import * as _tanstack_react_query from '@tanstack/react-query';
2
+ import { UseQueryOptions, UseMutationOptions } from '@tanstack/react-query';
3
+ import { Partner } from '@pfm-platform/shared';
4
+ import * as axios from 'axios';
5
+
6
+ /**
7
+ * Fetch current partner configuration
8
+ * GET /partners/current
9
+ *
10
+ * Partners are read-only configuration data
11
+ * Typically returns single partner (current tenant/white-label configuration)
12
+ */
13
+ declare function useCurrentPartner(options?: Omit<UseQueryOptions<Partner>, 'queryKey' | 'queryFn'>): _tanstack_react_query.UseQueryResult<{
14
+ id: number;
15
+ domain: string;
16
+ product_name: string;
17
+ browser_title: string;
18
+ partner_alerts_enabled: boolean;
19
+ demo: boolean;
20
+ modules: {
21
+ [x: string]: unknown;
22
+ };
23
+ featured_searches: unknown[];
24
+ }, Error>;
25
+
26
+ /**
27
+ * Partner create data interface
28
+ */
29
+ interface PartnerCreate {
30
+ domain: string;
31
+ product_name: string;
32
+ browser_title: string;
33
+ partner_alerts_enabled?: boolean;
34
+ demo?: boolean;
35
+ modules?: Record<string, unknown>;
36
+ featured_searches?: unknown[];
37
+ }
38
+ /**
39
+ * Parameters for useCreatePartner mutation
40
+ */
41
+ interface CreatePartnerParams {
42
+ data: PartnerCreate;
43
+ }
44
+ /**
45
+ * Mutation hook for creating a new partner
46
+ *
47
+ * Creates a partner manually for testing purposes.
48
+ * Uses mode switching for validation:
49
+ * - Admin mode: Allows manual partner creation for test data
50
+ * - User mode: Blocked (partners are configuration data)
51
+ *
52
+ * @example
53
+ * ```tsx
54
+ * const createPartner = useCreatePartner();
55
+ *
56
+ * createPartner.mutate({
57
+ * data: {
58
+ * domain: 'example.com',
59
+ * product_name: 'Example Product',
60
+ * browser_title: 'Example',
61
+ * demo: true
62
+ * }
63
+ * });
64
+ * ```
65
+ */
66
+ declare function useCreatePartner(options?: Omit<UseMutationOptions<Partner, Error, CreatePartnerParams>, 'mutationFn'>): _tanstack_react_query.UseMutationResult<{
67
+ id: number;
68
+ domain: string;
69
+ product_name: string;
70
+ browser_title: string;
71
+ partner_alerts_enabled: boolean;
72
+ demo: boolean;
73
+ modules: {
74
+ [x: string]: unknown;
75
+ };
76
+ featured_searches: unknown[];
77
+ }, Error, CreatePartnerParams, unknown>;
78
+
79
+ /**
80
+ * Partner update data interface
81
+ */
82
+ interface PartnerUpdate {
83
+ domain?: string;
84
+ product_name?: string;
85
+ browser_title?: string;
86
+ partner_alerts_enabled?: boolean;
87
+ demo?: boolean;
88
+ modules?: Record<string, unknown>;
89
+ featured_searches?: unknown[];
90
+ }
91
+ /**
92
+ * Parameters for useUpdatePartner mutation
93
+ */
94
+ interface UpdatePartnerParams {
95
+ partnerId: number;
96
+ data: PartnerUpdate;
97
+ }
98
+ /**
99
+ * Mutation hook for updating a partner
100
+ *
101
+ * Updates partner fields for testing purposes.
102
+ * Uses mode switching for validation:
103
+ * - Admin mode: Allows updating partners for test scenarios
104
+ * - User mode: Blocked (partners are configuration data)
105
+ *
106
+ * @example
107
+ * ```tsx
108
+ * const updatePartner = useUpdatePartner();
109
+ *
110
+ * updatePartner.mutate({
111
+ * partnerId: 1,
112
+ * data: {
113
+ * product_name: 'Updated Product Name'
114
+ * }
115
+ * });
116
+ * ```
117
+ */
118
+ declare function useUpdatePartner(options?: Omit<UseMutationOptions<Partner, Error, UpdatePartnerParams>, 'mutationFn'>): _tanstack_react_query.UseMutationResult<{
119
+ id: number;
120
+ domain: string;
121
+ product_name: string;
122
+ browser_title: string;
123
+ partner_alerts_enabled: boolean;
124
+ demo: boolean;
125
+ modules: {
126
+ [x: string]: unknown;
127
+ };
128
+ featured_searches: unknown[];
129
+ }, Error, UpdatePartnerParams, unknown>;
130
+
131
+ /**
132
+ * Parameters for useDeletePartner mutation
133
+ */
134
+ interface DeletePartnerParams {
135
+ partnerId: number;
136
+ }
137
+ /**
138
+ * Mutation hook for deleting a partner
139
+ *
140
+ * Deletes a partner from the system.
141
+ * Available in both admin and user modes (for test data cleanup).
142
+ *
143
+ * @example
144
+ * ```tsx
145
+ * const deletePartner = useDeletePartner();
146
+ *
147
+ * deletePartner.mutate({
148
+ * partnerId: 1
149
+ * });
150
+ * ```
151
+ */
152
+ declare function useDeletePartner(options?: Omit<UseMutationOptions<void, Error, DeletePartnerParams>, 'mutationFn'>): _tanstack_react_query.UseMutationResult<void, Error, DeletePartnerParams, unknown>;
153
+
154
+ /**
155
+ * Query key factory for Partners domain
156
+ */
157
+ declare const partnerKeys: {
158
+ all: readonly ["partners"];
159
+ current: () => readonly ["partners", "current"];
160
+ };
161
+
162
+ /**
163
+ * Axios instance for Partners API
164
+ * Base URL configured through environment variables or defaults to relative path
165
+ */
166
+ declare const api: axios.AxiosInstance;
167
+
168
+ export { type CreatePartnerParams, type DeletePartnerParams, type PartnerCreate, type PartnerUpdate, type UpdatePartnerParams, api, partnerKeys, useCreatePartner, useCurrentPartner, useDeletePartner, useUpdatePartner };
package/dist/index.js ADDED
@@ -0,0 +1,90 @@
1
+ import { useQuery, useQueryClient, useMutation } from '@tanstack/react-query';
2
+ import { PartnersResponseSchema, useAppMode, PartnerCreateSchemaAdmin, PartnerCreateSchemaUser, PartnerSchema, PartnerUpdateSchemaAdmin, PartnerUpdateSchemaUser, PartnerDeleteSchema } from '@pfm-platform/shared';
3
+ import axios from 'axios';
4
+
5
+ // src/queries/useCurrentPartner.ts
6
+ var api = axios.create({
7
+ baseURL: "/api",
8
+ headers: {
9
+ "Content-Type": "application/json"
10
+ }
11
+ });
12
+
13
+ // src/keys.ts
14
+ var partnerKeys = {
15
+ all: ["partners"],
16
+ current: () => [...partnerKeys.all, "current"]
17
+ };
18
+
19
+ // src/queries/useCurrentPartner.ts
20
+ function useCurrentPartner(options) {
21
+ return useQuery({
22
+ queryKey: partnerKeys.current(),
23
+ queryFn: async () => {
24
+ const response = await api.get("/partners/current");
25
+ const validated = PartnersResponseSchema.parse(response.data);
26
+ if (validated.partners.length === 0) {
27
+ throw new Error("No current partner configuration found");
28
+ }
29
+ return validated.partners[0];
30
+ },
31
+ staleTime: 1e3 * 60 * 60 * 24,
32
+ // 24 hours (partner config rarely changes)
33
+ ...options
34
+ });
35
+ }
36
+ function useCreatePartner(options) {
37
+ const queryClient = useQueryClient();
38
+ const { mode } = useAppMode();
39
+ return useMutation({
40
+ mutationFn: async ({ data }) => {
41
+ const schema = mode === "admin" ? PartnerCreateSchemaAdmin : PartnerCreateSchemaUser;
42
+ const validated = schema.parse(data);
43
+ const response = await api.post("/partners/current", validated);
44
+ return PartnerSchema.parse(response.data);
45
+ },
46
+ onSuccess: () => {
47
+ queryClient.invalidateQueries({
48
+ queryKey: partnerKeys.current()
49
+ });
50
+ },
51
+ ...options
52
+ });
53
+ }
54
+ function useUpdatePartner(options) {
55
+ const queryClient = useQueryClient();
56
+ const { mode } = useAppMode();
57
+ return useMutation({
58
+ mutationFn: async ({ partnerId, data }) => {
59
+ const schema = mode === "admin" ? PartnerUpdateSchemaAdmin : PartnerUpdateSchemaUser;
60
+ const validated = schema.parse(data);
61
+ const response = await api.put(`/partners/${partnerId}`, validated);
62
+ return PartnerSchema.parse(response.data);
63
+ },
64
+ onSuccess: () => {
65
+ queryClient.invalidateQueries({
66
+ queryKey: partnerKeys.current()
67
+ });
68
+ },
69
+ ...options
70
+ });
71
+ }
72
+ function useDeletePartner(options) {
73
+ const queryClient = useQueryClient();
74
+ return useMutation({
75
+ mutationFn: async ({ partnerId }) => {
76
+ const validated = PartnerDeleteSchema.parse({ id: partnerId });
77
+ await api.delete(`/partners/${validated.id}`);
78
+ },
79
+ onSuccess: () => {
80
+ queryClient.invalidateQueries({
81
+ queryKey: partnerKeys.current()
82
+ });
83
+ },
84
+ ...options
85
+ });
86
+ }
87
+
88
+ export { api, partnerKeys, useCreatePartner, useCurrentPartner, useDeletePartner, useUpdatePartner };
89
+ //# sourceMappingURL=index.js.map
90
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../src/client.ts","../src/keys.ts","../src/queries/useCurrentPartner.ts","../src/mutations/useCreatePartner.ts","../src/mutations/useUpdatePartner.ts","../src/mutations/useDeletePartner.ts"],"names":["useQueryClient","useAppMode","useMutation","PartnerSchema"],"mappings":"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","file":"index.js","sourcesContent":["import axios from 'axios';\n\n/**\n * Axios instance for Partners API\n * Base URL configured through environment variables or defaults to relative path\n */\nexport const api = axios.create({\n baseURL: '/api',\n headers: {\n 'Content-Type': 'application/json',\n },\n});\n","/**\n * Query key factory for Partners domain\n */\nexport const partnerKeys = {\n all: ['partners'] as const,\n current: () => [...partnerKeys.all, 'current'] as const,\n};\n","import { useQuery, UseQueryOptions } from '@tanstack/react-query';\nimport { Partner, PartnersResponseSchema } from '@pfm-platform/shared';\nimport { api } from '../client.js';\nimport { partnerKeys } from '../keys.js';\n\n/**\n * Fetch current partner configuration\n * GET /partners/current\n *\n * Partners are read-only configuration data\n * Typically returns single partner (current tenant/white-label configuration)\n */\nexport function useCurrentPartner(\n options?: Omit<UseQueryOptions<Partner>, 'queryKey' | 'queryFn'>\n) {\n return useQuery({\n queryKey: partnerKeys.current(),\n queryFn: async () => {\n const response = await api.get('/partners/current');\n const validated = PartnersResponseSchema.parse(response.data);\n // Return first partner (current partner configuration)\n if (validated.partners.length === 0) {\n throw new Error('No current partner configuration found');\n }\n return validated.partners[0];\n },\n staleTime: 1000 * 60 * 60 * 24, // 24 hours (partner config rarely changes)\n ...options,\n });\n}\n","import {\n useMutation,\n useQueryClient,\n type UseMutationOptions,\n} from '@tanstack/react-query';\nimport {\n PartnerCreateSchemaAdmin,\n PartnerCreateSchemaUser,\n PartnerSchema,\n useAppMode,\n} from '@pfm-platform/shared';\nimport type { Partner } from '@pfm-platform/shared';\nimport { api } from '../client';\nimport { partnerKeys } from '../keys';\n\n/**\n * Partner create data interface\n */\nexport interface PartnerCreate {\n domain: string;\n product_name: string;\n browser_title: string;\n partner_alerts_enabled?: boolean;\n demo?: boolean;\n modules?: Record<string, unknown>;\n featured_searches?: unknown[];\n}\n\n/**\n * Parameters for useCreatePartner mutation\n */\nexport interface CreatePartnerParams {\n data: PartnerCreate;\n}\n\n/**\n * Mutation hook for creating a new partner\n *\n * Creates a partner manually for testing purposes.\n * Uses mode switching for validation:\n * - Admin mode: Allows manual partner creation for test data\n * - User mode: Blocked (partners are configuration data)\n *\n * @example\n * ```tsx\n * const createPartner = useCreatePartner();\n *\n * createPartner.mutate({\n * data: {\n * domain: 'example.com',\n * product_name: 'Example Product',\n * browser_title: 'Example',\n * demo: true\n * }\n * });\n * ```\n */\nexport function useCreatePartner(\n options?: Omit<UseMutationOptions<Partner, Error, CreatePartnerParams>, 'mutationFn'>\n) {\n const queryClient = useQueryClient();\n const { mode } = useAppMode();\n\n return useMutation({\n mutationFn: async ({ data }: CreatePartnerParams) => {\n // Select schema based on mode\n const schema =\n mode === 'admin'\n ? PartnerCreateSchemaAdmin\n : PartnerCreateSchemaUser;\n\n // Validate partner data\n const validated = schema.parse(data);\n\n // POST to create new partner\n const response = await api.post('/partners/current', validated);\n\n // Return created partner\n return PartnerSchema.parse(response.data);\n },\n onSuccess: () => {\n // Invalidate partner query to refetch updated data\n queryClient.invalidateQueries({\n queryKey: partnerKeys.current(),\n });\n },\n ...options,\n });\n}\n","import {\n useMutation,\n useQueryClient,\n type UseMutationOptions,\n} from '@tanstack/react-query';\nimport {\n PartnerUpdateSchemaAdmin,\n PartnerUpdateSchemaUser,\n PartnerSchema,\n useAppMode,\n} from '@pfm-platform/shared';\nimport type { Partner } from '@pfm-platform/shared';\nimport { api } from '../client';\nimport { partnerKeys } from '../keys';\n\n/**\n * Partner update data interface\n */\nexport interface PartnerUpdate {\n domain?: string;\n product_name?: string;\n browser_title?: string;\n partner_alerts_enabled?: boolean;\n demo?: boolean;\n modules?: Record<string, unknown>;\n featured_searches?: unknown[];\n}\n\n/**\n * Parameters for useUpdatePartner mutation\n */\nexport interface UpdatePartnerParams {\n partnerId: number;\n data: PartnerUpdate;\n}\n\n/**\n * Mutation hook for updating a partner\n *\n * Updates partner fields for testing purposes.\n * Uses mode switching for validation:\n * - Admin mode: Allows updating partners for test scenarios\n * - User mode: Blocked (partners are configuration data)\n *\n * @example\n * ```tsx\n * const updatePartner = useUpdatePartner();\n *\n * updatePartner.mutate({\n * partnerId: 1,\n * data: {\n * product_name: 'Updated Product Name'\n * }\n * });\n * ```\n */\nexport function useUpdatePartner(\n options?: Omit<UseMutationOptions<Partner, Error, UpdatePartnerParams>, 'mutationFn'>\n) {\n const queryClient = useQueryClient();\n const { mode } = useAppMode();\n\n return useMutation({\n mutationFn: async ({ partnerId, data }: UpdatePartnerParams) => {\n // Select schema based on mode\n const schema =\n mode === 'admin'\n ? PartnerUpdateSchemaAdmin\n : PartnerUpdateSchemaUser;\n\n // Validate partner update data\n const validated = schema.parse(data);\n\n // PUT to update partner\n const response = await api.put(`/partners/${partnerId}`, validated);\n\n // Return updated partner\n return PartnerSchema.parse(response.data);\n },\n onSuccess: () => {\n // Invalidate partner query to refetch updated data\n queryClient.invalidateQueries({\n queryKey: partnerKeys.current(),\n });\n },\n ...options,\n });\n}\n","import {\n useMutation,\n useQueryClient,\n type UseMutationOptions,\n} from '@tanstack/react-query';\nimport { PartnerDeleteSchema } from '@pfm-platform/shared';\nimport { api } from '../client';\nimport { partnerKeys } from '../keys';\n\n/**\n * Parameters for useDeletePartner mutation\n */\nexport interface DeletePartnerParams {\n partnerId: number;\n}\n\n/**\n * Mutation hook for deleting a partner\n *\n * Deletes a partner from the system.\n * Available in both admin and user modes (for test data cleanup).\n *\n * @example\n * ```tsx\n * const deletePartner = useDeletePartner();\n *\n * deletePartner.mutate({\n * partnerId: 1\n * });\n * ```\n */\nexport function useDeletePartner(\n options?: Omit<UseMutationOptions<void, Error, DeletePartnerParams>, 'mutationFn'>\n) {\n const queryClient = useQueryClient();\n\n return useMutation({\n mutationFn: async ({ partnerId }: DeletePartnerParams) => {\n // Validate partner ID\n const validated = PartnerDeleteSchema.parse({ id: partnerId });\n\n // DELETE partner\n await api.delete(`/partners/${validated.id}`);\n },\n onSuccess: () => {\n // Invalidate partner query to refetch updated list\n queryClient.invalidateQueries({\n queryKey: partnerKeys.current(),\n });\n },\n ...options,\n });\n}\n"]}
package/package.json ADDED
@@ -0,0 +1,61 @@
1
+ {
2
+ "name": "@pfm-platform/partners-data-access",
3
+ "version": "0.1.1",
4
+ "type": "module",
5
+ "main": "./dist/index.js",
6
+ "dependencies": {
7
+ "axios": "^1.13.2",
8
+ "zod": "4.1.12",
9
+ "@pfm-platform/shared": "0.0.1"
10
+ },
11
+ "devDependencies": {
12
+ "@testing-library/react": "^16.3.0",
13
+ "@vitejs/plugin-react": "^5.1.1",
14
+ "@vitest/coverage-v8": "^4.0.9",
15
+ "jsdom": "^27.2.0",
16
+ "react-dom": "19.2.0",
17
+ "typescript": "5.9.3",
18
+ "vitest": "4.0.9"
19
+ },
20
+ "module": "./dist/index.js",
21
+ "types": "./dist/index.d.ts",
22
+ "exports": {
23
+ ".": {
24
+ "types": "./dist/index.d.ts",
25
+ "import": "./dist/index.js",
26
+ "require": "./dist/index.cjs"
27
+ }
28
+ },
29
+ "files": [
30
+ "dist",
31
+ "README.md"
32
+ ],
33
+ "description": "Personal Finance Management - PARTNERS data-access layer",
34
+ "keywords": [
35
+ "pfm",
36
+ "finance",
37
+ "partners",
38
+ "data-access",
39
+ "react",
40
+ "typescript"
41
+ ],
42
+ "author": "Lenny Miller",
43
+ "license": "MIT",
44
+ "repository": {
45
+ "type": "git",
46
+ "url": "https://github.com/lennylmiller/pfm-research",
47
+ "directory": "packages/partners/data-access"
48
+ },
49
+ "bugs": "https://github.com/lennylmiller/pfm-research/issues",
50
+ "homepage": "https://github.com/lennylmiller/pfm-research#readme",
51
+ "peerDependencies": {
52
+ "@tanstack/react-query": "5.90.9",
53
+ "react": "19.2.0"
54
+ },
55
+ "scripts": {
56
+ "test": "vitest run",
57
+ "test:watch": "vitest",
58
+ "test:coverage": "vitest run --coverage",
59
+ "build": "tsup src/index.ts --format cjs,esm --dts --clean"
60
+ }
61
+ }