@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 +101 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +168 -0
- package/dist/index.d.ts +168 -0
- package/dist/index.js +90 -0
- package/dist/index.js.map +1 -0
- package/package.json +61 -0
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"]}
|
package/dist/index.d.cts
ADDED
|
@@ -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.d.ts
ADDED
|
@@ -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
|
+
}
|