Skip to content

Commit

Permalink
chore: wip
Browse files Browse the repository at this point in the history
  • Loading branch information
glennmichael123 committed Jun 22, 2024
1 parent a6fbe6a commit d4050dd
Show file tree
Hide file tree
Showing 15 changed files with 68 additions and 17 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ export async function up(db: Database<any>) {
.addColumn('id', 'integer', col => col.primaryKey().autoIncrement())
.addColumn('name', 'varchar(255)')
.addColumn('token', 'varchar(512)', col => col.unique())
.addColumn('plainTextToken', 'varchar(512)')
.addColumn('plain_text_token', 'varchar(512)')
.addColumn('abilities', sql`enum('read', 'write', 'admin', 'read|write', 'read|admin', 'write|admin', 'read|write|admin')`)
.addColumn('team_id', 'integer', (col) =>
col.references('teams.id').onDelete('cascade')
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@ export async function up(db: Database<any>) {
.createTable('teams')
.addColumn('id', 'integer', col => col.primaryKey().autoIncrement())
.addColumn('name', 'varchar(255)')
.addColumn('companyName', 'varchar(255)')
.addColumn('company_name', 'varchar(255)')
.addColumn('email', 'varchar(255)')
.addColumn('billingEmail', 'varchar(255)')
.addColumn('billing_email', 'varchar(255)')
.addColumn('status', 'varchar(255)')
.addColumn('description', 'varchar(255)')
.addColumn('path', 'varchar(255)')
.addColumn('isPersonal', 'boolean')
.addColumn('is_personal', 'boolean')
.addColumn('accesstoken_id', 'integer', (col) =>
col.references('personal_access_tokens.id').onDelete('cascade')
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,13 +5,13 @@ export async function up(db: Database<any>) {
await db.schema
.createTable('deployments')
.addColumn('id', 'integer', col => col.primaryKey().autoIncrement())
.addColumn('commitSha', 'varchar(512)', col => col.unique())
.addColumn('commitMessage', 'varchar(255)')
.addColumn('commit_sha', 'varchar(512)', col => col.unique())
.addColumn('commit_message', 'varchar(255)')
.addColumn('branch', 'varchar(255)')
.addColumn('status', 'varchar(255)')
.addColumn('executionTime', 'integer')
.addColumn('deployScript', 'varchar(255)')
.addColumn('terminalOutput', 'varchar(255)')
.addColumn('execution_time', 'integer')
.addColumn('deploy_script', 'varchar(255)')
.addColumn('terminal_output', 'varchar(255)')
.addColumn('user_id', 'integer', (col) =>
col.references('users.id').onDelete('cascade')
)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ export async function up(db: Database<any>) {
.addColumn('id', 'integer', col => col.primaryKey().autoIncrement())
.addColumn('name', 'varchar(255)', col => col.notNull())
.addColumn('email', 'varchar(255)', col => col.unique().notNull())
.addColumn('jobTitle', 'varchar(255)', col => col.notNull())
.addColumn('job_title', 'varchar(255)', col => col.notNull())
.addColumn('password', 'varchar(255)', col => col.notNull())
.addColumn('created_at', 'timestamp', col => col.notNull().defaultTo(sql.raw('CURRENT_TIMESTAMP')))
.addColumn('updated_at', 'timestamp')
Expand Down
8 changes: 8 additions & 0 deletions database/migrations/1719030584016-update-users-table.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import type { Database } from '@stacksjs/database'
import { sql } from '@stacksjs/database'

export async function up(db: Database<any>) {
await db.schema.alterTable('users')
.addColumn('content', 'varchar(255)', col => col.notNull())
.execute();
}
8 changes: 8 additions & 0 deletions database/migrations/1719031504777-update-users-table.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
import type { Database } from '@stacksjs/database'
import { sql } from '@stacksjs/database'

export async function up(db: Database<any>) {
await db.schema.alterTable('users')
.dropColumn('content')
.execute();
}
40 changes: 35 additions & 5 deletions storage/framework/core/database/src/drivers/mysql.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { ok } from '@stacksjs/error-handling'
import { getModelName, getTableName } from '@stacksjs/orm'
import { path } from '@stacksjs/path'
import { fs, glob } from '@stacksjs/storage'
import { snakeCase } from '@stacksjs/strings'
import type { Attribute, Attributes, Model } from '@stacksjs/types'
import {
checkPivotMigration,
Expand Down Expand Up @@ -140,9 +141,9 @@ async function createTableMigration(modelPath: string) {

for (const [fieldName, options] of Object.entries(fields)) {
const fieldOptions = options as Attribute

const fieldNameFormatted = snakeCase(fieldName)
const columnType = mapFieldTypeToColumnType(fieldOptions.validation?.rule)
migrationContent += ` .addColumn('${fieldName}', ${columnType}`
migrationContent += ` .addColumn('${fieldNameFormatted}', ${columnType}`

// Check if there are configurations that require the lambda function
if (fieldOptions.unique || fieldOptions?.required) {
Expand Down Expand Up @@ -230,8 +231,12 @@ export async function createAlterTableMigration(modelPath: string) {
const currentFields = model.attributes as Attributes

// Determine fields to add and remove
const fieldsToAdd = Object.keys(currentFields)
const fieldsToRemove = Object.keys(lastFields)

const changes = pluckChanges(Object.keys(lastFields), Object.keys(currentFields))

const fieldsToAdd = changes?.added || []

const fieldsToRemove = changes?.removed || []

let migrationContent = `import type { Database } from '@stacksjs/database'\n`
migrationContent += `import { sql } from '@stacksjs/database'\n\n`
Expand All @@ -242,9 +247,23 @@ export async function createAlterTableMigration(modelPath: string) {
for (const fieldName of fieldsToAdd) {
const options = currentFields[fieldName] as Attribute
const columnType = mapFieldTypeToColumnType(options.validation?.rule)
migrationContent += ` .addColumn('${fieldName}', '${columnType}')\n`
const formattedFieldName = snakeCase(fieldName)

migrationContent += ` .addColumn('${formattedFieldName}', ${columnType}`

// Check if there are configurations that require the lambda function
if (options.unique || options?.required) {
migrationContent += `, col => col`
if (options.unique) migrationContent += `.unique()`
if (options?.required) migrationContent += `.notNull()`
migrationContent += ``
}

migrationContent += `)\n`
}

console.log(migrationContent)

// Remove fields that no longer exist
for (const fieldName of fieldsToRemove) migrationContent += ` .dropColumn('${fieldName}')\n`

Expand All @@ -261,6 +280,17 @@ export async function createAlterTableMigration(modelPath: string) {
log.success(`Created migration: ${italic(migrationFileName)}`)
}

function pluckChanges(array1: string[], array2: string[]): { added: string[]; removed: string[] } | null {
const removed = array1.filter((item) => !array2.includes(item))
const added = array2.filter((item) => !array1.includes(item))

if (removed.length === 0 && added.length === 0) {
return null
}

return { added, removed }
}

export async function fetchMysqlTables(): Promise<string[]> {
const modelFiles = glob.sync(path.userModelsPath('*.ts'))
const tables: string[] = []
Expand Down
4 changes: 3 additions & 1 deletion storage/framework/core/database/src/drivers/postgres.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { ok } from '@stacksjs/error-handling'
import { getTableName } from '@stacksjs/orm'
import { path } from '@stacksjs/path'
import { fs, glob } from '@stacksjs/storage'
import { snakeCase } from '@stacksjs/strings'
import type { Attribute, Model } from '@stacksjs/types'
import {
checkPivotMigration,
Expand Down Expand Up @@ -141,8 +142,9 @@ async function createTableMigration(modelPath: string) {

for (const [fieldName, options] of Object.entries(fields)) {
const fieldOptions = options as Attribute
const fieldNameFormatted = snakeCase(fieldName)
const columnType = mapFieldTypeToColumnType(fieldOptions.validations?.rule)
migrationContent += ` .addColumn('${fieldName}', '${columnType}'`
migrationContent += ` .addColumn('${fieldNameFormatted}', '${columnType}'`

// Check if there are configurations that require the lambda function
if (fieldOptions.unique || fieldOptions.validations?.rule?.required) {
Expand Down
5 changes: 4 additions & 1 deletion storage/framework/core/database/src/drivers/sqlite.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { ok } from '@stacksjs/error-handling'
import { getModelName, getTableName } from '@stacksjs/orm'
import { path } from '@stacksjs/path'
import { fs, glob } from '@stacksjs/storage'
import { snakeCase } from '@stacksjs/strings'
import type { Attribute, Attributes, Model } from '@stacksjs/types'
import {
checkPivotMigration,
Expand Down Expand Up @@ -236,8 +237,10 @@ export async function createAlterTableMigration(modelPath: string) {
// Add new fields
for (const fieldName of fieldsToAdd) {
const options = currentFields[fieldName] as Attribute
const fieldNameFormatted = snakeCase(fieldName)

const columnType = mapFieldTypeToColumnType(options.validations?.rule)
migrationContent += ` .addColumn('${fieldName}', '${columnType}')\n`
migrationContent += ` .addColumn('${fieldNameFormatted}', '${columnType}')\n`
}

// Remove fields that no longer exist
Expand Down

0 comments on commit d4050dd

Please sign in to comment.