diff --git a/package-lock.json b/package-lock.json index 6f3035a..5a66f1b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@athenna/database", - "version": "1.2.9", + "version": "1.3.0", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "@athenna/database", - "version": "1.2.9", + "version": "1.3.0", "license": "MIT", "dependencies": { "@athenna/artisan": "1.5.9", diff --git a/package.json b/package.json index e234d7a..ac0dc5a 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@athenna/database", - "version": "1.2.9", + "version": "1.3.0", "description": "The Athenna database handler for SQL/NoSQL.", "license": "MIT", "author": "João Lenon ", diff --git a/src/Database/Builders/QueryBuilder.js b/src/Database/Builders/QueryBuilder.js index 0d30ccc..0af8d6b 100644 --- a/src/Database/Builders/QueryBuilder.js +++ b/src/Database/Builders/QueryBuilder.js @@ -218,7 +218,7 @@ export class QueryBuilder { /** * Create data or update if already exists. * - * @param {any | any[]} data + * @param {any} data * @param {string} [primaryKey] * @return {Promise} */ diff --git a/src/Drivers/MySqlDriver.js b/src/Drivers/MySqlDriver.js index 7783b1b..713b198 100644 --- a/src/Drivers/MySqlDriver.js +++ b/src/Drivers/MySqlDriver.js @@ -587,7 +587,7 @@ export class MySqlDriver { /** * Create data or update if already exists. * - * @param {any | any[]} data + * @param {any} data * @param {string} [primaryKey] * @return {Promise} */ diff --git a/src/Drivers/PostgresDriver.js b/src/Drivers/PostgresDriver.js index 8af6a8a..aa6ce03 100644 --- a/src/Drivers/PostgresDriver.js +++ b/src/Drivers/PostgresDriver.js @@ -584,7 +584,7 @@ export class PostgresDriver { /** * Create data or update if already exists. * - * @param {any | any[]} data + * @param {any} data * @param {string} [primaryKey] * @return {Promise} */ diff --git a/src/Models/Model.js b/src/Models/Model.js index 7082f71..278224f 100644 --- a/src/Models/Model.js +++ b/src/Models/Model.js @@ -58,6 +58,15 @@ export class Model { return 'id' } + /** + * Set the default attributes of your model. + * + * @return {Record} + */ + static get attributes() { + return {} + } + /** * The attributes that could be persisted in database. * diff --git a/src/Models/ModelQueryBuilder.js b/src/Models/ModelQueryBuilder.js index 825368c..2fa4ed5 100644 --- a/src/Models/ModelQueryBuilder.js +++ b/src/Models/ModelQueryBuilder.js @@ -219,6 +219,16 @@ export class ModelQueryBuilder { } } + const attributes = this.#Model.attributes + + Object.keys(attributes).forEach(key => { + if (data[key]) { + return + } + + data[key] = attributes[key] + }) + return this.#generator.generateOne(await this.#QB.create(data)) } @@ -234,13 +244,29 @@ export class ModelQueryBuilder { data = this.#fillable(data) } - return this.#generator.generateMany(await this.#QB.createMany(data)) + const executor = data => { + const attributes = this.#Model.attributes + + Object.keys(attributes).forEach(key => { + if (data[key]) { + return + } + + data[key] = attributes[key] + }) + + return data + } + + return this.#generator.generateMany( + await this.#QB.createMany(data.map(executor)), + ) } /** * Create or update models in database. * - * @param data {any | any[]} + * @param data {any} * @param {boolean} ignorePersistOnly * @return {Promise} */ @@ -249,6 +275,16 @@ export class ModelQueryBuilder { data = this.#fillable(data) } + const attributes = this.#Model.attributes + + Object.keys(attributes).forEach(key => { + if (data[key]) { + return + } + + data[key] = attributes[key] + }) + return this.#generator.generateOne(await this.#QB.createOrUpdate(data)) } diff --git a/src/index.d.ts b/src/index.d.ts index dad1b32..987b073 100644 --- a/src/index.d.ts +++ b/src/index.d.ts @@ -906,6 +906,13 @@ export class Model { */ static get primaryKey(): string + /** + * Set the default attributes of your model. + * + * @return {Record} + */ + static get attributes(): Record + /** * The attributes that could be persisted in database. * diff --git a/tests/Stubs/models/ProductMySql.js b/tests/Stubs/models/ProductMySql.js index 520db9d..d3fbe35 100644 --- a/tests/Stubs/models/ProductMySql.js +++ b/tests/Stubs/models/ProductMySql.js @@ -20,6 +20,18 @@ export class ProductMySql extends Model { return 'products' } + /** + * Set the default attributes of your model. + * + * @return {Record} + */ + static get attributes() { + return { + name: this.faker.commerce.productName(), + price: this.faker.commerce.price(), + } + } + /** * The attributes that could be persisted in database. * diff --git a/tests/Stubs/models/User.js b/tests/Stubs/models/User.js index d2de001..e374246 100644 --- a/tests/Stubs/models/User.js +++ b/tests/Stubs/models/User.js @@ -2,6 +2,18 @@ import { Model, Column, Relation } from '#src/index' import { Product } from '#tests/Stubs/models/Product' export class User extends Model { + /** + * Set the default attributes of your model. + * + * @return {Record} + */ + static get attributes() { + return { + name: this.faker.name.fullName(), + email: this.faker.internet.email(), + } + } + /** * The attributes that could be persisted in database. * diff --git a/tests/Unit/Models/ProductModelTest.js b/tests/Unit/Models/ProductModelTest.js index 60a3cc0..d85b095 100644 --- a/tests/Unit/Models/ProductModelTest.js +++ b/tests/Unit/Models/ProductModelTest.js @@ -398,4 +398,19 @@ test.group('ProductModelTest', group => { assert.lengthOf(groupByProducts, 10) }) + + test('should be able to create product and products using default attributes', async ({ assert }) => { + const product = await ProductMySql.create({ name: 'Hello 1' }) + const products = await ProductMySql.createMany([{ name: 'Hello 2' }, {}]) + + assert.isDefined(product.id) + assert.notDeepEqual(product.price, 0) + assert.deepEqual(product.name, 'Hello 1') + + products.forEach(product => { + assert.isDefined(product.id) + assert.isDefined(product.name) + assert.notDeepEqual(product.price, 0) + }) + }) }) diff --git a/tests/Unit/Models/UserModelTest.js b/tests/Unit/Models/UserModelTest.js index 225a236..241d4b3 100644 --- a/tests/Unit/Models/UserModelTest.js +++ b/tests/Unit/Models/UserModelTest.js @@ -418,4 +418,20 @@ test.group('UserModelTest', group => { assert.lengthOf(groupByUsers, 10) }) + + test('should be able to create user and users using default attributes', async ({ assert }) => { + const user = await User.query().select('*').create({ name: 'Hello 1' }) + const users = await User.query() + .select('*') + .createMany([{ name: 'Hello 2' }, {}]) + + assert.isDefined(user.id) + assert.isDefined(user.email) + assert.deepEqual(user.name, 'Hello 1') + + users.forEach(user => { + assert.isDefined(user.id) + assert.isDefined(user.email) + }) + }) })