-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathdb.ts
144 lines (132 loc) · 3.96 KB
/
db.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
/**
* Types for payload database operations
*/
export type CollectionQuery = Record<string, any>
export type CollectionData = Record<string, any>
export interface PayloadDBCollection {
find: (query?: CollectionQuery) => Promise<any>
findOne: (query?: CollectionQuery) => Promise<any> // Returns first item or null
get: (id: string, query?: CollectionQuery) => Promise<any> // Alias for findById
create: (data: CollectionData, query?: CollectionQuery) => Promise<any>
update: (id: string, data: CollectionData, query?: CollectionQuery) => Promise<any>
upsert: (id: string, data: CollectionData, query?: CollectionQuery) => Promise<any>
set: (id: string, data: CollectionData, query?: CollectionQuery) => Promise<any> // Alias for update
delete: (id: string, query?: CollectionQuery) => Promise<any>
}
export type PayloadDB = Record<string, PayloadDBCollection>
/**
* Creates a database client from a Payload CMS instance
* @param payload - Payload CMS instance
* @returns PayloadDB instance with collection proxies
*/
export const createPayloadDB = (payload: any): PayloadDB => {
const db: PayloadDB = {}
const collections = payload.collections || {}
for (const collectionName of Object.keys(collections)) {
db[collectionName] = {
find: async (query = {}) => {
return payload.find({
collection: collectionName,
where: query,
})
},
findOne: async (query = {}) => {
const result = await payload.find({
collection: collectionName,
where: query,
limit: 1,
})
return result.docs?.[0] || null
},
get: async (id, query = {}) => {
return payload.findByID({
collection: collectionName,
id,
...query,
})
},
create: async (data, query = {}) => {
return payload.create({
collection: collectionName,
data,
...query,
})
},
update: async (id, data, query = {}) => {
return payload.update({
collection: collectionName,
id,
data,
...query,
})
},
upsert: async (id, data, query = {}) => {
try {
await payload.findByID({
collection: collectionName,
id,
})
return payload.update({
collection: collectionName,
id,
data,
...query,
})
} catch (error) {
return payload.create({
collection: collectionName,
data: { id, ...data },
...query,
})
}
},
set: async (id, data, query = {}) => {
return payload.update({
collection: collectionName,
id,
data,
...query,
})
},
delete: async (id, query = {}) => {
return payload.delete({
collection: collectionName,
id,
...query,
})
},
}
}
return db
}
/**
* Initialize a payload client from the root config
* This is a simplified version that directly imports from the root config
*/
export const initializePayloadDB = async (): Promise<PayloadDB> => {
try {
const { getPayload } = await import('payload')
const { default: config } = await import('../payload.config')
const payload = await getPayload({ config })
return createPayloadDB(payload)
} catch (error) {
console.error('Error initializing payload DB:', error)
throw error
}
}
/**
* Get payload client and DB for API handlers
* Used by clickable-apis to initialize payload
*/
export const getPayloadClient = async () => {
try {
const { getPayload } = await import('payload')
const { default: config } = await import('../payload.config')
const payload = await getPayload({ config })
const db = createPayloadDB(payload)
return { payload, db }
} catch (error) {
console.error('Error initializing payload client:', error)
throw error
}
}