Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions eslint.config.mjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
import nextConfig from 'eslint-config-next';

export default nextConfig;
54 changes: 30 additions & 24 deletions migrations/1752677590715_create-entries-and-entry-tags-table.cjs
Original file line number Diff line number Diff line change
Expand Up @@ -14,32 +14,38 @@ exports.up = (pgm) => {
);

// Create 'entries' table (this part remains as is, as it's working)
pgm.createTable("entries", {
id: { type: "text", primaryKey: true }, // Consistent with text IDs from app logic
title: { type: "text", notNull: true },
definition: { type: "text", notNull: true },
type: { type: "text", notNull: true }, // 'exicon' or 'lexicon'
aliases: { type: "jsonb", default: "[]" },
video_link: { type: "text" },
created_at: {
type: "timestamp",
notNull: true,
default: pgm.func("current_timestamp"),
pgm.createTable(
"entries",
{
id: { type: "text", primaryKey: true }, // Consistent with text IDs from app logic
title: { type: "text", notNull: true },
definition: { type: "text", notNull: true },
type: { type: "text", notNull: true }, // 'exicon' or 'lexicon'
aliases: { type: "jsonb", default: "[]" },
video_link: { type: "text" },
created_at: {
type: "timestamp",
notNull: true,
default: pgm.func("current_timestamp"),
},
updated_at: {
type: "timestamp",
notNull: true,
default: pgm.func("current_timestamp"),
},
},
updated_at: {
type: "timestamp",
notNull: true,
default: pgm.func("current_timestamp"),
},
});
{
ifNotExists: true,
}
);

pgm.createIndex("entries", "title");
pgm.createIndex("entries", "type");
pgm.createIndex("entries", "title", { ifNotExists: true });
pgm.createIndex("entries", "type", { ifNotExists: true });

// --- WORKAROUND: Create entry_tags join table using raw SQL ---
// This bypasses the JavaScript object definition for node-pg-migrate's primaryKey parsing
pgm.sql(`
CREATE TABLE "entry_tags" (
CREATE TABLE IF NOT EXISTS "entry_tags" (
"entry_id" TEXT NOT NULL REFERENCES "entries"("id") ON DELETE CASCADE,
"tag_id" TEXT NOT NULL REFERENCES "tags"("id") ON DELETE CASCADE,
PRIMARY KEY ("entry_id", "tag_id")
Expand Down Expand Up @@ -68,11 +74,11 @@ exports.down = (pgm) => {
// When using pgm.sql for UP, you should use pgm.sql for DOWN too for consistency,
// or ensure pgm.dropTable can correctly identify the table created by pgm.sql.
// In this case, pgm.dropTable should still work as it targets the table name.
pgm.dropTable("entry_tags"); // Drop dependent table first
pgm.dropTable("entries");
pgm.dropTable("entry_tags", { ifExists: true }); // Drop dependent table first
pgm.dropTable("entries", { ifExists: true });
// Drop indexes if they were explicitly created in this migration
pgm.dropIndex("entries", "type");
pgm.dropIndex("entries", "title");
pgm.dropIndex("entries", "type", { ifExists: true });
pgm.dropIndex("entries", "title", { ifExists: true });
console.log(
"[MIGRATION_LOG] Finished migration: create_entries_and_entry_tags_table DOWN"
);
Expand Down
55 changes: 55 additions & 0 deletions migrations/1752732000000_add-mentioned-entries-column.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
/**
* @type {import('node-pg-migrate').ColumnDefinitions | undefined}
*/
exports.shorthands = undefined;

/**
* @param pgm {import('node-pg-migrate').MigrationBuilder}
* @param run {() => void | undefined}
* @returns {Promise<void> | void}
*/
exports.up = (pgm) => {
console.log(
"[MIGRATION_LOG] Starting migration: add_mentioned_entries_column_to_entries UP"
);

pgm.sql(`
ALTER TABLE entries
ADD COLUMN IF NOT EXISTS mentioned_entries JSONB DEFAULT '[]'::jsonb;
`);

pgm.sql(`
ALTER TABLE entries
ALTER COLUMN mentioned_entries SET DEFAULT '[]'::jsonb;
`);

pgm.sql(`
UPDATE entries
SET mentioned_entries = '[]'::jsonb
WHERE mentioned_entries IS NULL;
`);

console.log(
"[MIGRATION_LOG] Finished migration: add_mentioned_entries_column_to_entries UP"
);
};

/**
* @param pgm {import('node-pg-migrate').MigrationBuilder}
* @param run {() => void | undefined}
* @returns {Promise<void> | void}
*/
exports.down = (pgm) => {
console.log(
"[MIGRATION_LOG] Starting migration: add_mentioned_entries_column_to_entries DOWN"
);

pgm.sql(`
ALTER TABLE entries
DROP COLUMN IF EXISTS mentioned_entries;
`);

console.log(
"[MIGRATION_LOG] Finished migration: add_mentioned_entries_column_to_entries DOWN"
);
};
88 changes: 88 additions & 0 deletions migrations/1752732100000_create-entry-references-table.cjs
Original file line number Diff line number Diff line change
@@ -0,0 +1,88 @@
/**
* @type {import('node-pg-migrate').ColumnDefinitions | undefined}
*/
exports.shorthands = undefined;

/**
* @param pgm {import('node-pg-migrate').MigrationBuilder}
* @param run {() => void | undefined}
* @returns {Promise<void> | void}
*/
exports.up = (pgm) => {
console.log(
"[MIGRATION_LOG] Starting migration: create_entry_references_table UP"
);

pgm.createTable(
"entry_references",
{
id: {
type: "serial",
primaryKey: true,
},
source_entry_id: {
type: "text",
notNull: true,
references: '"entries"',
onDelete: "CASCADE",
},
target_entry_id: {
type: "text",
notNull: true,
references: '"entries"',
onDelete: "CASCADE",
},
context: {
type: "text",
notNull: true,
default: "",
},
created_at: {
type: "timestamp",
notNull: true,
default: pgm.func("current_timestamp"),
},
},
{
ifNotExists: true,
}
);

pgm.addConstraint("entry_references", "entry_references_unique_source_target", {
unique: ["source_entry_id", "target_entry_id"],
});

pgm.createIndex("entry_references", ["source_entry_id"], {
ifNotExists: true,
});

pgm.createIndex("entry_references", ["target_entry_id"], {
ifNotExists: true,
});

console.log(
"[MIGRATION_LOG] Finished migration: create_entry_references_table UP"
);
};

/**
* @param pgm {import('node-pg-migrate').MigrationBuilder}
* @param run {() => void | undefined}
* @returns {Promise<void> | void}
*/
exports.down = (pgm) => {
console.log(
"[MIGRATION_LOG] Starting migration: create_entry_references_table DOWN"
);

pgm.dropIndex("entry_references", ["target_entry_id"], { ifExists: true });
pgm.dropIndex("entry_references", ["source_entry_id"], { ifExists: true });
pgm.dropConstraint("entry_references", "entry_references_unique_source_target", {
ifExists: true,
});
pgm.dropTable("entry_references", { ifExists: true });

console.log(
"[MIGRATION_LOG] Finished migration: create_entry_references_table DOWN"
);
};
Loading