From f1565e4c43210c3e180a29cdcb38387fa0574e52 Mon Sep 17 00:00:00 2001 From: jlenon7 Date: Tue, 22 Jul 2025 10:11:29 -0300 Subject: [PATCH] feat: add alterTable method --- package-lock.json | 4 ++-- package.json | 2 +- src/database/DatabaseImpl.ts | 10 ++++++++++ src/database/drivers/Driver.ts | 8 ++++++++ src/database/drivers/FakeDriver.ts | 5 +++++ src/database/drivers/MongoDriver.ts | 7 +++++++ src/database/drivers/MySqlDriver.ts | 10 ++++++++++ src/database/drivers/PostgresDriver.ts | 10 ++++++++++ src/database/drivers/SqliteDriver.ts | 10 ++++++++++ src/database/transactions/Transaction.ts | 10 ++++++++++ tests/unit/database/DatabaseImplTest.ts | 13 +++++++++++++ tests/unit/database/transactions/TransactionTest.ts | 13 +++++++++++++ 12 files changed, 99 insertions(+), 3 deletions(-) diff --git a/package-lock.json b/package-lock.json index 992e74f..bb31aac 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@athenna/database", - "version": "5.25.0", + "version": "5.26.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@athenna/database", - "version": "5.25.0", + "version": "5.26.0", "license": "MIT", "dependencies": { "@faker-js/faker": "^8.4.1", diff --git a/package.json b/package.json index ef622d5..44fe8d1 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@athenna/database", - "version": "5.25.0", + "version": "5.26.0", "description": "The Athenna database handler for SQL/NoSQL.", "license": "MIT", "author": "João Lenon ", diff --git a/src/database/DatabaseImpl.ts b/src/database/DatabaseImpl.ts index 883ccef..09c7e75 100644 --- a/src/database/DatabaseImpl.ts +++ b/src/database/DatabaseImpl.ts @@ -258,6 +258,16 @@ export class DatabaseImpl extends Macroable { await this.driver.createTable(table, closure) } + /** + * Alter a table in database. + */ + public async alterTable( + table: string, + closure: (builder: Knex.TableBuilder) => void | Promise + ): Promise { + await this.driver.alterTable(table, closure) + } + /** * Drop a table in database. */ diff --git a/src/database/drivers/Driver.ts b/src/database/drivers/Driver.ts index ceff06b..746216d 100644 --- a/src/database/drivers/Driver.ts +++ b/src/database/drivers/Driver.ts @@ -278,6 +278,14 @@ export abstract class Driver { closure?: TableBuilder ): Promise + /** + * Alter a table in database. + */ + public abstract alterTable( + table: string, + closure?: TableBuilder + ): Promise + /** * Drop a table in database. */ diff --git a/src/database/drivers/FakeDriver.ts b/src/database/drivers/FakeDriver.ts index 084ec19..3ec46aa 100644 --- a/src/database/drivers/FakeDriver.ts +++ b/src/database/drivers/FakeDriver.ts @@ -233,6 +233,11 @@ export class FakeDriver { this.tables.push(table) } + /** + * Alter a table in database. + */ + public static async alterTable(): Promise {} + /** * Drop a table in database. */ diff --git a/src/database/drivers/MongoDriver.ts b/src/database/drivers/MongoDriver.ts index 3a6e020..e6eb40e 100644 --- a/src/database/drivers/MongoDriver.ts +++ b/src/database/drivers/MongoDriver.ts @@ -334,6 +334,13 @@ export class MongoDriver extends Driver { throw new NotImplementedMethodException(this.createTable.name, 'mongo') } + /** + * Alter a table in database. + */ + public async alterTable(): Promise { + throw new NotImplementedMethodException(this.alterTable.name, 'mongo') + } + /** * Drop a table in database. */ diff --git a/src/database/drivers/MySqlDriver.ts b/src/database/drivers/MySqlDriver.ts index 5dfcd17..9cf5e03 100644 --- a/src/database/drivers/MySqlDriver.ts +++ b/src/database/drivers/MySqlDriver.ts @@ -261,6 +261,16 @@ export class MySqlDriver extends Driver { await this.client.schema.createTable(table, closure) } + /** + * Alter a table in database. + */ + public async alterTable( + table: string, + closure: (builder: Knex.TableBuilder) => void | Promise + ): Promise { + await this.client.schema.alterTable(table, closure) + } + /** * Drop a table in database. */ diff --git a/src/database/drivers/PostgresDriver.ts b/src/database/drivers/PostgresDriver.ts index 3cceb5e..153860d 100644 --- a/src/database/drivers/PostgresDriver.ts +++ b/src/database/drivers/PostgresDriver.ts @@ -272,6 +272,16 @@ export class PostgresDriver extends Driver { await this.client.schema.createTable(table, closure) } + /** + * Alter a table in database. + */ + public async alterTable( + table: string, + closure: (builder: Knex.TableBuilder) => void | Promise + ): Promise { + await this.client.schema.alterTable(table, closure) + } + /** * Drop a table in database. */ diff --git a/src/database/drivers/SqliteDriver.ts b/src/database/drivers/SqliteDriver.ts index 61ce6fb..8f5e465 100644 --- a/src/database/drivers/SqliteDriver.ts +++ b/src/database/drivers/SqliteDriver.ts @@ -271,6 +271,16 @@ export class SqliteDriver extends Driver { await this.client.schema.createTable(table, closure) } + /** + * Alter a table in database. + */ + public async alterTable( + table: string, + closure: (builder: Knex.TableBuilder) => void | Promise + ): Promise { + await this.client.schema.alterTable(table, closure) + } + /** * Drop a table in database. */ diff --git a/src/database/transactions/Transaction.ts b/src/database/transactions/Transaction.ts index 59588f3..ddf42c7 100644 --- a/src/database/transactions/Transaction.ts +++ b/src/database/transactions/Transaction.ts @@ -127,6 +127,16 @@ export class Transaction extends Macroable { return this.driver.createTable(table, closure) } + /** + * Alter a table in database. + */ + public async alterTable( + table: string, + closure?: (builder: Knex.TableBuilder) => void | Promise + ): Promise { + return this.driver.alterTable(table, closure) + } + /** * Drop a table in database. */ diff --git a/tests/unit/database/DatabaseImplTest.ts b/tests/unit/database/DatabaseImplTest.ts index c7c70dd..38c8829 100644 --- a/tests/unit/database/DatabaseImplTest.ts +++ b/tests/unit/database/DatabaseImplTest.ts @@ -234,6 +234,19 @@ export default class DatabaseImplTest { assert.calledOnceWith(database.driver.createTable, 'users') } + @Test() + public async shouldBeAbleToAlterTableInDatabase({ assert }: Context) { + Mock.when(FakeDriver, 'alterTable').resolve(undefined) + Mock.when(ConnectionFactory, 'fabricate').return(FakeDriver) + + const database = new DatabaseImpl().connection('postgres') + await database.alterTable('users', builder => { + builder.string('id').primary() + }) + + assert.calledOnceWith(database.driver.alterTable, 'users') + } + @Test() public async shouldBeAbleToDropTheDatabaseTable({ assert }: Context) { Mock.when(FakeDriver, 'dropTable').resolve(undefined) diff --git a/tests/unit/database/transactions/TransactionTest.ts b/tests/unit/database/transactions/TransactionTest.ts index 91fde94..198a9a0 100644 --- a/tests/unit/database/transactions/TransactionTest.ts +++ b/tests/unit/database/transactions/TransactionTest.ts @@ -183,6 +183,19 @@ export default class TransactionTest { assert.calledOnceWith(trx.driver.createTable, 'users') } + @Test() + public async shouldBeAbleToAlterTableInDatabase({ assert }: Context) { + Mock.when(FakeDriver, 'alterTable').resolve(undefined) + Mock.when(ConnectionFactory, 'fabricate').return(FakeDriver) + + const trx = new Transaction(FakeDriver) + await trx.alterTable('users', builder => { + builder.string('id').primary() + }) + + assert.calledOnceWith(trx.driver.alterTable, 'users') + } + @Test() public async shouldBeAbleToDropTheDatabaseTable({ assert }: Context) { Mock.when(FakeDriver, 'dropTable').resolve(undefined)