@newcms/database 0.0.2 → 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.
@@ -0,0 +1 @@
1
+ {"version":3,"file":"post-repository.js","sourceRoot":"","sources":["../../src/repositories/post-repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,50 @@
1
+ import type { Database } from '../connection.js';
2
+ import type { PostRow } from './post-repository.js';
3
+ /**
4
+ * Repository for post revisions.
5
+ *
6
+ * Revisions are stored as posts with type='revision' and
7
+ * postParent pointing to the original post.
8
+ */
9
+ export declare class RevisionRepository {
10
+ private db;
11
+ constructor(db: Database);
12
+ /**
13
+ * Create a revision snapshot of a post.
14
+ * Returns undefined if nothing changed since the last revision.
15
+ *
16
+ * @param post - The current state of the post (before or after update)
17
+ * @param authorId - The user who made the change
18
+ */
19
+ createRevision(post: PostRow, authorId: number): Promise<PostRow | undefined>;
20
+ /**
21
+ * Get all revisions for a post, newest first.
22
+ */
23
+ getRevisions(postId: number, limit?: number): Promise<PostRow[]>;
24
+ /**
25
+ * Get the most recent revision for a post.
26
+ */
27
+ getLatest(postId: number): Promise<PostRow | undefined>;
28
+ /**
29
+ * Get a specific revision by ID.
30
+ */
31
+ getById(revisionId: number): Promise<PostRow | undefined>;
32
+ /**
33
+ * Restore a post to a specific revision.
34
+ * Returns the updated post.
35
+ */
36
+ restore(postId: number, revisionId: number): Promise<PostRow | undefined>;
37
+ /**
38
+ * Delete old revisions beyond the keep limit.
39
+ */
40
+ cleanup(postId: number, keepCount: number): Promise<number>;
41
+ /**
42
+ * Count revisions for a post.
43
+ */
44
+ count(postId: number): Promise<number>;
45
+ /**
46
+ * Check if any tracked field changed between two post states.
47
+ */
48
+ private hasChanges;
49
+ }
50
+ //# sourceMappingURL=revision-repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revision-repository.d.ts","sourceRoot":"","sources":["../../src/repositories/revision-repository.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAEjD,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,sBAAsB,CAAC;AAYpD;;;;;GAKG;AACH,qBAAa,kBAAkB;IAClB,OAAO,CAAC,EAAE;gBAAF,EAAE,EAAE,QAAQ;IAEhC;;;;;;OAMG;IACG,cAAc,CAAC,IAAI,EAAE,OAAO,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IA6BnF;;OAEG;IACG,YAAY,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IAetE;;OAEG;IACG,SAAS,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAK7D;;OAEG;IACG,OAAO,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAS/D;;;OAGG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAoB/E;;OAEG;IACG,OAAO,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAyBjE;;OAEG;IACG,KAAK,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,MAAM,CAAC;IAS5C;;OAEG;IACH,OAAO,CAAC,UAAU;CAMlB"}
@@ -0,0 +1,149 @@
1
+ import { eq, and, desc, sql } from 'drizzle-orm';
2
+ import { posts } from '../schema/index.js';
3
+ /**
4
+ * Fields that are tracked for revision diffing.
5
+ * If none of these change, no revision is created.
6
+ */
7
+ const REVISION_FIELDS = [
8
+ 'postTitle',
9
+ 'postContent',
10
+ 'postExcerpt',
11
+ ];
12
+ /**
13
+ * Repository for post revisions.
14
+ *
15
+ * Revisions are stored as posts with type='revision' and
16
+ * postParent pointing to the original post.
17
+ */
18
+ export class RevisionRepository {
19
+ db;
20
+ constructor(db) {
21
+ this.db = db;
22
+ }
23
+ /**
24
+ * Create a revision snapshot of a post.
25
+ * Returns undefined if nothing changed since the last revision.
26
+ *
27
+ * @param post - The current state of the post (before or after update)
28
+ * @param authorId - The user who made the change
29
+ */
30
+ async createRevision(post, authorId) {
31
+ // Check if anything actually changed
32
+ const lastRevision = await this.getLatest(post.id);
33
+ if (lastRevision && !this.hasChanges(post, lastRevision)) {
34
+ return undefined;
35
+ }
36
+ const now = new Date();
37
+ const [revision] = await this.db
38
+ .insert(posts)
39
+ .values({
40
+ postAuthor: authorId,
41
+ postDate: now,
42
+ postDateGmt: now,
43
+ postModified: now,
44
+ postModifiedGmt: now,
45
+ postTitle: post.postTitle,
46
+ postContent: post.postContent,
47
+ postExcerpt: post.postExcerpt,
48
+ postStatus: 'inherit',
49
+ postName: `${post.id}-revision-v1`,
50
+ postType: 'revision',
51
+ postParent: post.id,
52
+ })
53
+ .returning();
54
+ return revision;
55
+ }
56
+ /**
57
+ * Get all revisions for a post, newest first.
58
+ */
59
+ async getRevisions(postId, limit) {
60
+ let query = this.db
61
+ .select()
62
+ .from(posts)
63
+ .where(and(eq(posts.postParent, postId), eq(posts.postType, 'revision')))
64
+ .orderBy(desc(posts.postDate))
65
+ .$dynamic();
66
+ if (limit !== undefined) {
67
+ query = query.limit(limit);
68
+ }
69
+ return (await query);
70
+ }
71
+ /**
72
+ * Get the most recent revision for a post.
73
+ */
74
+ async getLatest(postId) {
75
+ const rows = await this.getRevisions(postId, 1);
76
+ return rows[0];
77
+ }
78
+ /**
79
+ * Get a specific revision by ID.
80
+ */
81
+ async getById(revisionId) {
82
+ const rows = await this.db
83
+ .select()
84
+ .from(posts)
85
+ .where(and(eq(posts.id, revisionId), eq(posts.postType, 'revision')))
86
+ .limit(1);
87
+ return rows[0];
88
+ }
89
+ /**
90
+ * Restore a post to a specific revision.
91
+ * Returns the updated post.
92
+ */
93
+ async restore(postId, revisionId) {
94
+ const revision = await this.getById(revisionId);
95
+ if (!revision || revision.postParent !== postId)
96
+ return undefined;
97
+ const now = new Date();
98
+ const [updated] = await this.db
99
+ .update(posts)
100
+ .set({
101
+ postTitle: revision.postTitle,
102
+ postContent: revision.postContent,
103
+ postExcerpt: revision.postExcerpt,
104
+ postModified: now,
105
+ postModifiedGmt: now,
106
+ })
107
+ .where(eq(posts.id, postId))
108
+ .returning();
109
+ return updated;
110
+ }
111
+ /**
112
+ * Delete old revisions beyond the keep limit.
113
+ */
114
+ async cleanup(postId, keepCount) {
115
+ const revisions = await this.getRevisions(postId);
116
+ if (revisions.length <= keepCount)
117
+ return 0;
118
+ const toDelete = revisions.slice(keepCount);
119
+ const idsToDelete = toDelete.map((r) => r.id);
120
+ if (idsToDelete.length === 0)
121
+ return 0;
122
+ const result = await this.db
123
+ .delete(posts)
124
+ .where(and(sql `${posts.id} IN (${sql.join(idsToDelete.map((id) => sql `${id}`), sql `, `)})`, eq(posts.postType, 'revision')))
125
+ .returning({ id: posts.id });
126
+ return result.length;
127
+ }
128
+ /**
129
+ * Count revisions for a post.
130
+ */
131
+ async count(postId) {
132
+ const [result] = await this.db
133
+ .select({ count: sql `count(*)::int` })
134
+ .from(posts)
135
+ .where(and(eq(posts.postParent, postId), eq(posts.postType, 'revision')));
136
+ return result.count;
137
+ }
138
+ /**
139
+ * Check if any tracked field changed between two post states.
140
+ */
141
+ hasChanges(current, previous) {
142
+ for (const field of REVISION_FIELDS) {
143
+ if (current[field] !== previous[field])
144
+ return true;
145
+ }
146
+ return false;
147
+ }
148
+ }
149
+ //# sourceMappingURL=revision-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"revision-repository.js","sourceRoot":"","sources":["../../src/repositories/revision-repository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,63 @@
1
+ import type { Database } from '../connection.js';
2
+ import { MetaRepository } from './meta-repository.js';
3
+ export interface CreateTermInput {
4
+ name: string;
5
+ slug?: string;
6
+ taxonomy: string;
7
+ description?: string;
8
+ parent?: number;
9
+ }
10
+ export interface TermRow {
11
+ termId: number;
12
+ name: string;
13
+ slug: string;
14
+ termGroup: number;
15
+ termTaxonomyId: number;
16
+ taxonomy: string;
17
+ description: string;
18
+ parent: number;
19
+ count: number;
20
+ }
21
+ /**
22
+ * Repository for taxonomy terms (categories, tags, custom taxonomies).
23
+ */
24
+ export declare class TaxonomyRepository {
25
+ private db;
26
+ readonly meta: MetaRepository;
27
+ constructor(db: Database);
28
+ /**
29
+ * Create a new term in a taxonomy.
30
+ */
31
+ createTerm(input: CreateTermInput): Promise<TermRow>;
32
+ /**
33
+ * Get a term by ID and taxonomy.
34
+ */
35
+ getTermById(termId: number, taxonomy: string): Promise<TermRow | undefined>;
36
+ /**
37
+ * Get a term by slug and taxonomy.
38
+ */
39
+ getTermBySlug(slug: string, taxonomy: string): Promise<TermRow | undefined>;
40
+ /**
41
+ * Get all terms in a taxonomy.
42
+ */
43
+ getTerms(taxonomy: string, parentId?: number): Promise<TermRow[]>;
44
+ /**
45
+ * Assign terms to an object (post).
46
+ */
47
+ setObjectTerms(objectId: number, termTaxonomyIds: number[]): Promise<void>;
48
+ /**
49
+ * Get terms assigned to an object.
50
+ */
51
+ getObjectTerms(objectId: number, taxonomy?: string): Promise<TermRow[]>;
52
+ /**
53
+ * Delete a term and all its relationships.
54
+ */
55
+ deleteTerm(termId: number, taxonomy: string): Promise<boolean>;
56
+ /**
57
+ * Recount the number of objects assigned to terms.
58
+ */
59
+ recountTerms(termTaxonomyIds: number[]): Promise<void>;
60
+ private generateSlug;
61
+ private ensureUniqueSlug;
62
+ }
63
+ //# sourceMappingURL=taxonomy-repository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taxonomy-repository.d.ts","sourceRoot":"","sources":["../../src/repositories/taxonomy-repository.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAOjD,OAAO,EAAE,cAAc,EAA+C,MAAM,sBAAsB,CAAC;AAEnG,MAAM,WAAW,eAAe;IAC/B,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,MAAM,CAAC,EAAE,MAAM,CAAC;CAChB;AAED,MAAM,WAAW,OAAO;IACvB,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,SAAS,EAAE,MAAM,CAAC;IAClB,cAAc,EAAE,MAAM,CAAC;IACvB,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,MAAM,CAAC;IACpB,MAAM,EAAE,MAAM,CAAC;IACf,KAAK,EAAE,MAAM,CAAC;CACd;AAED;;GAEG;AACH,qBAAa,kBAAkB;IAGlB,OAAO,CAAC,EAAE;IAFtB,QAAQ,CAAC,IAAI,EAAE,cAAc,CAAC;gBAEV,EAAE,EAAE,QAAQ;IAgBhC;;OAEG;IACG,UAAU,CAAC,KAAK,EAAE,eAAe,GAAG,OAAO,CAAC,OAAO,CAAC;IAoC1D;;OAEG;IACG,WAAW,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAqBjF;;OAEG;IACG,aAAa,CAAC,IAAI,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,GAAG,SAAS,CAAC;IAqBjF;;OAEG;IACG,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IA0BvE;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IA+ChF;;OAEG;IACG,cAAc,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,EAAE,CAAC;IA8B7E;;OAEG;IACG,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IA+BpE;;OAEG;IACG,YAAY,CAAC,eAAe,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,IAAI,CAAC;IAc5D,OAAO,CAAC,YAAY;YAYN,gBAAgB;CAqB9B"}
@@ -0,0 +1,268 @@
1
+ import { eq, and, sql, inArray } from 'drizzle-orm';
2
+ import { terms, termTaxonomy, termRelationships, termmeta, } from '../schema/index.js';
3
+ import { MetaRepository } from './meta-repository.js';
4
+ /**
5
+ * Repository for taxonomy terms (categories, tags, custom taxonomies).
6
+ */
7
+ export class TaxonomyRepository {
8
+ db;
9
+ meta;
10
+ constructor(db) {
11
+ this.db = db;
12
+ const metaCols = {
13
+ metaId: termmeta.metaId,
14
+ objectId: termmeta.termId,
15
+ metaKey: termmeta.metaKey,
16
+ metaValue: termmeta.metaValue,
17
+ metaValueJson: termmeta.metaValueJson,
18
+ };
19
+ const colNames = {
20
+ table: 'termmeta',
21
+ sql: { metaId: 'meta_id', objectId: 'term_id', metaKey: 'meta_key', metaValue: 'meta_value', metaValueJson: 'meta_value_json' },
22
+ ts: { metaId: 'metaId', objectId: 'termId', metaKey: 'metaKey', metaValue: 'metaValue', metaValueJson: 'metaValueJson' },
23
+ };
24
+ this.meta = new MetaRepository(db, termmeta, metaCols, colNames);
25
+ }
26
+ /**
27
+ * Create a new term in a taxonomy.
28
+ */
29
+ async createTerm(input) {
30
+ const slug = input.slug || this.generateSlug(input.name);
31
+ const uniqueSlug = await this.ensureUniqueSlug(slug);
32
+ const [term] = await this.db
33
+ .insert(terms)
34
+ .values({
35
+ name: input.name,
36
+ slug: uniqueSlug,
37
+ })
38
+ .returning();
39
+ const [tt] = await this.db
40
+ .insert(termTaxonomy)
41
+ .values({
42
+ termId: term.termId,
43
+ taxonomy: input.taxonomy,
44
+ description: input.description ?? '',
45
+ parent: input.parent ?? 0,
46
+ count: 0,
47
+ })
48
+ .returning();
49
+ return {
50
+ termId: term.termId,
51
+ name: term.name,
52
+ slug: term.slug,
53
+ termGroup: term.termGroup,
54
+ termTaxonomyId: tt.termTaxonomyId,
55
+ taxonomy: tt.taxonomy,
56
+ description: tt.description,
57
+ parent: tt.parent,
58
+ count: tt.count,
59
+ };
60
+ }
61
+ /**
62
+ * Get a term by ID and taxonomy.
63
+ */
64
+ async getTermById(termId, taxonomy) {
65
+ const rows = await this.db
66
+ .select({
67
+ termId: terms.termId,
68
+ name: terms.name,
69
+ slug: terms.slug,
70
+ termGroup: terms.termGroup,
71
+ termTaxonomyId: termTaxonomy.termTaxonomyId,
72
+ taxonomy: termTaxonomy.taxonomy,
73
+ description: termTaxonomy.description,
74
+ parent: termTaxonomy.parent,
75
+ count: termTaxonomy.count,
76
+ })
77
+ .from(terms)
78
+ .innerJoin(termTaxonomy, eq(terms.termId, termTaxonomy.termId))
79
+ .where(and(eq(terms.termId, termId), eq(termTaxonomy.taxonomy, taxonomy)))
80
+ .limit(1);
81
+ return rows[0];
82
+ }
83
+ /**
84
+ * Get a term by slug and taxonomy.
85
+ */
86
+ async getTermBySlug(slug, taxonomy) {
87
+ const rows = await this.db
88
+ .select({
89
+ termId: terms.termId,
90
+ name: terms.name,
91
+ slug: terms.slug,
92
+ termGroup: terms.termGroup,
93
+ termTaxonomyId: termTaxonomy.termTaxonomyId,
94
+ taxonomy: termTaxonomy.taxonomy,
95
+ description: termTaxonomy.description,
96
+ parent: termTaxonomy.parent,
97
+ count: termTaxonomy.count,
98
+ })
99
+ .from(terms)
100
+ .innerJoin(termTaxonomy, eq(terms.termId, termTaxonomy.termId))
101
+ .where(and(eq(terms.slug, slug), eq(termTaxonomy.taxonomy, taxonomy)))
102
+ .limit(1);
103
+ return rows[0];
104
+ }
105
+ /**
106
+ * Get all terms in a taxonomy.
107
+ */
108
+ async getTerms(taxonomy, parentId) {
109
+ const conditions = [eq(termTaxonomy.taxonomy, taxonomy)];
110
+ if (parentId !== undefined) {
111
+ conditions.push(eq(termTaxonomy.parent, parentId));
112
+ }
113
+ const rows = await this.db
114
+ .select({
115
+ termId: terms.termId,
116
+ name: terms.name,
117
+ slug: terms.slug,
118
+ termGroup: terms.termGroup,
119
+ termTaxonomyId: termTaxonomy.termTaxonomyId,
120
+ taxonomy: termTaxonomy.taxonomy,
121
+ description: termTaxonomy.description,
122
+ parent: termTaxonomy.parent,
123
+ count: termTaxonomy.count,
124
+ })
125
+ .from(terms)
126
+ .innerJoin(termTaxonomy, eq(terms.termId, termTaxonomy.termId))
127
+ .where(and(...conditions))
128
+ .orderBy(terms.name);
129
+ return rows;
130
+ }
131
+ /**
132
+ * Assign terms to an object (post).
133
+ */
134
+ async setObjectTerms(objectId, termTaxonomyIds) {
135
+ // Remove existing relationships for these taxonomies
136
+ const existingTtIds = termTaxonomyIds.length > 0
137
+ ? await this.db
138
+ .select({ taxonomy: termTaxonomy.taxonomy })
139
+ .from(termTaxonomy)
140
+ .where(inArray(termTaxonomy.termTaxonomyId, termTaxonomyIds))
141
+ : [];
142
+ const taxonomies = [...new Set(existingTtIds.map((r) => r.taxonomy))];
143
+ if (taxonomies.length > 0) {
144
+ // Get all term_taxonomy_ids for these taxonomies
145
+ const allTtIds = await this.db
146
+ .select({ termTaxonomyId: termTaxonomy.termTaxonomyId })
147
+ .from(termTaxonomy)
148
+ .where(inArray(termTaxonomy.taxonomy, taxonomies));
149
+ const allTtIdValues = allTtIds.map((r) => r.termTaxonomyId);
150
+ if (allTtIdValues.length > 0) {
151
+ await this.db
152
+ .delete(termRelationships)
153
+ .where(and(eq(termRelationships.objectId, objectId), inArray(termRelationships.termTaxonomyId, allTtIdValues)));
154
+ }
155
+ }
156
+ // Insert new relationships
157
+ if (termTaxonomyIds.length > 0) {
158
+ await this.db.insert(termRelationships).values(termTaxonomyIds.map((ttId, i) => ({
159
+ objectId,
160
+ termTaxonomyId: ttId,
161
+ termOrder: i,
162
+ }))).onConflictDoNothing();
163
+ }
164
+ // Update counts
165
+ await this.recountTerms(termTaxonomyIds);
166
+ }
167
+ /**
168
+ * Get terms assigned to an object.
169
+ */
170
+ async getObjectTerms(objectId, taxonomy) {
171
+ const conditions = [eq(termRelationships.objectId, objectId)];
172
+ if (taxonomy) {
173
+ conditions.push(eq(termTaxonomy.taxonomy, taxonomy));
174
+ }
175
+ const rows = await this.db
176
+ .select({
177
+ termId: terms.termId,
178
+ name: terms.name,
179
+ slug: terms.slug,
180
+ termGroup: terms.termGroup,
181
+ termTaxonomyId: termTaxonomy.termTaxonomyId,
182
+ taxonomy: termTaxonomy.taxonomy,
183
+ description: termTaxonomy.description,
184
+ parent: termTaxonomy.parent,
185
+ count: termTaxonomy.count,
186
+ })
187
+ .from(termRelationships)
188
+ .innerJoin(termTaxonomy, eq(termRelationships.termTaxonomyId, termTaxonomy.termTaxonomyId))
189
+ .innerJoin(terms, eq(termTaxonomy.termId, terms.termId))
190
+ .where(and(...conditions))
191
+ .orderBy(termRelationships.termOrder);
192
+ return rows;
193
+ }
194
+ /**
195
+ * Delete a term and all its relationships.
196
+ */
197
+ async deleteTerm(termId, taxonomy) {
198
+ const term = await this.getTermById(termId, taxonomy);
199
+ if (!term)
200
+ return false;
201
+ // Delete relationships
202
+ await this.db
203
+ .delete(termRelationships)
204
+ .where(eq(termRelationships.termTaxonomyId, term.termTaxonomyId));
205
+ // Delete term_taxonomy
206
+ await this.db
207
+ .delete(termTaxonomy)
208
+ .where(eq(termTaxonomy.termTaxonomyId, term.termTaxonomyId));
209
+ // Delete term (if not used by another taxonomy)
210
+ const otherUsages = await this.db
211
+ .select({ termTaxonomyId: termTaxonomy.termTaxonomyId })
212
+ .from(termTaxonomy)
213
+ .where(eq(termTaxonomy.termId, termId))
214
+ .limit(1);
215
+ if (otherUsages.length === 0) {
216
+ await this.db.delete(terms).where(eq(terms.termId, termId));
217
+ }
218
+ // Delete meta
219
+ await this.meta.deleteAllForObject(termId);
220
+ return true;
221
+ }
222
+ /**
223
+ * Recount the number of objects assigned to terms.
224
+ */
225
+ async recountTerms(termTaxonomyIds) {
226
+ for (const ttId of termTaxonomyIds) {
227
+ const [result] = await this.db
228
+ .select({ count: sql `count(*)::int` })
229
+ .from(termRelationships)
230
+ .where(eq(termRelationships.termTaxonomyId, ttId));
231
+ await this.db
232
+ .update(termTaxonomy)
233
+ .set({ count: result.count })
234
+ .where(eq(termTaxonomy.termTaxonomyId, ttId));
235
+ }
236
+ }
237
+ generateSlug(name) {
238
+ return name
239
+ .toLowerCase()
240
+ .normalize('NFD')
241
+ .replace(/[\u0300-\u036f]/g, '')
242
+ .replace(/[^a-z0-9_\s-]/g, '')
243
+ .replace(/\s+/g, '-')
244
+ .replace(/-+/g, '-')
245
+ .replace(/^-|-$/g, '')
246
+ .substring(0, 200);
247
+ }
248
+ async ensureUniqueSlug(slug, excludeId) {
249
+ let candidate = slug;
250
+ let suffix = 2;
251
+ while (true) {
252
+ const conditions = [eq(terms.slug, candidate)];
253
+ if (excludeId !== undefined) {
254
+ conditions.push(sql `${terms.termId} != ${excludeId}`);
255
+ }
256
+ const existing = await this.db
257
+ .select({ termId: terms.termId })
258
+ .from(terms)
259
+ .where(and(...conditions))
260
+ .limit(1);
261
+ if (existing.length === 0)
262
+ return candidate;
263
+ candidate = `${slug}-${suffix}`;
264
+ suffix++;
265
+ }
266
+ }
267
+ }
268
+ //# sourceMappingURL=taxonomy-repository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"taxonomy-repository.js","sourceRoot":"","sources":["../../src/repositories/taxonomy-repository.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"file":"terms.d.ts","sourceRoot":"","sources":["../../src/schema/terms.ts"],"names":[],"mappings":"AAYA,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EASjB,CAAC;AAEF,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgBxB,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAc7B,CAAC;AAEF,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAepB,CAAC"}
1
+ {"version":3,"file":"terms.d.ts","sourceRoot":"","sources":["../../src/schema/terms.ts"],"names":[],"mappings":"AAaA,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EASjB,CAAC;AAEF,eAAO,MAAM,YAAY;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAgBxB,CAAC;AAEF,eAAO,MAAM,iBAAiB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAe7B,CAAC;AAEF,eAAO,MAAM,QAAQ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;EAepB,CAAC"}
@@ -1,4 +1,4 @@
1
- import { pgTable, serial, bigint, text, varchar, index, jsonb, uniqueIndex, } from 'drizzle-orm/pg-core';
1
+ import { pgTable, serial, bigint, text, varchar, index, jsonb, uniqueIndex, primaryKey, } from 'drizzle-orm/pg-core';
2
2
  import { posts } from './posts.js';
3
3
  export const terms = pgTable('terms', {
4
4
  termId: serial('term_id').primaryKey(),
@@ -28,6 +28,7 @@ export const termRelationships = pgTable('term_relationships', {
28
28
  .references(() => termTaxonomy.termTaxonomyId, { onDelete: 'cascade' }),
29
29
  termOrder: bigint('term_order', { mode: 'number' }).notNull().default(0),
30
30
  }, (table) => [
31
+ primaryKey({ columns: [table.objectId, table.termTaxonomyId] }),
31
32
  index('idx_term_taxonomy_id').on(table.termTaxonomyId),
32
33
  ]);
33
34
  export const termmeta = pgTable('termmeta', {
@@ -1 +1 @@
1
- {"version":3,"file":"terms.js","sourceRoot":"","sources":["../../src/schema/terms.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"terms.js","sourceRoot":"","sources":["../../src/schema/terms.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@newcms/database",
3
- "version": "0.0.2",
3
+ "version": "0.1.1",
4
4
  "type": "module",
5
5
  "description": "Database schema, object cache, and repositories for NewCMS",
6
6
  "license": "GPL-2.0-or-later",
@@ -33,14 +33,14 @@
33
33
  "README.md"
34
34
  ],
35
35
  "dependencies": {
36
- "drizzle-orm": "^0.44.2",
37
- "postgres": "^3.4.7",
38
- "ioredis": "^5.6.1"
36
+ "drizzle-orm": "^0.45.2",
37
+ "ioredis": "^5.6.1",
38
+ "postgres": "^3.4.7"
39
39
  },
40
40
  "devDependencies": {
41
41
  "@types/node": "^22.15.3",
42
- "drizzle-kit": "^0.31.1",
43
42
  "dotenv": "^16.5.0",
43
+ "drizzle-kit": "^0.31.1",
44
44
  "tsx": "^4.19.4",
45
45
  "typescript": "^5.9.3",
46
46
  "vitest": "^3.2.4",