Skip to content
Merged
Show file tree
Hide file tree
Changes from 4 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
5 changes: 3 additions & 2 deletions .github/workflows/migrate-db.yml
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,7 @@ jobs:
run: npm ci

- name: Run database migrations
run: npm run db:migrate
run: npm run db:migrate -- --env ${{ inputs.environment }}
env:
DATABASE_URL: ${{ secrets.DATABASE_URL }}
CLOUDFLARE_API_TOKEN: ${{ secrets.CLOUDFLARE_API_TOKEN }}
CLOUDFLARE_ACCOUNT_ID: ${{ secrets.CLOUDFLARE_ACCOUNT_ID }}
32 changes: 25 additions & 7 deletions app/db/columns.helpers.ts
Original file line number Diff line number Diff line change
@@ -1,25 +1,43 @@
import { timestamp } from 'drizzle-orm/pg-core';
import { sql } from 'drizzle-orm';
import { text } from 'drizzle-orm/sqlite-core';

export const timestampColumns = {
updated_at: timestamp('updated_at', { withTimezone: true })
updated_at: text('updated_at')
.notNull()
.defaultNow(),
created_at: timestamp('created_at', { withTimezone: true })
.default(sql`(strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))`),
created_at: text('created_at')
.notNull()
.defaultNow(),
.default(sql`(strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))`),
};

/**
* Adapted from https://github.com/drizzle-team/drizzle-orm/discussions/1914#discussioncomment-9600199
* @param myEnum
* @returns
*/
export function enumToPgEnum<const T extends Record<string, string>>(
export function enumToSqliteEnum<const T extends Record<string, string>>(
myEnum: T,
): [T[keyof T], ...T[keyof T][]] {
const values = Object.values(myEnum) as T[keyof T][];
if (values.length === 0) {
throw new Error('Cannot create a Postgres enum from an empty object');
throw new Error('Cannot create a SQLite enum from an empty object');
}
return values as [T[keyof T], ...T[keyof T][]];
}

export function sqliteEnum<const Values extends readonly [string, ...string[]]>(
_name: string,
values: Values,
) {
return (columnName?: string) => {
if (columnName == null) {
return text({ enum: values }).$type<Values[number]>();
}

return text(columnName, { enum: values }).$type<Values[number]>();
};
}

export function jsonText<T>(name: string) {
return text(name, { mode: 'json' }).$type<T>();
}
Loading