diff --git a/package-lock.json b/package-lock.json index da3b20d..1ac5ba5 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,12 +1,12 @@ { "name": "@athenna/database", - "version": "5.37.0", + "version": "5.38.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@athenna/database", - "version": "5.37.0", + "version": "5.38.0", "license": "MIT", "dependencies": { "@faker-js/faker": "^8.4.1" diff --git a/package.json b/package.json index 8ebcf7e..0dddb8d 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "@athenna/database", - "version": "5.37.0", + "version": "5.38.0", "description": "The Athenna database handler for SQL/NoSQL.", "license": "MIT", "author": "João Lenon ", diff --git a/src/database/drivers/Driver.ts b/src/database/drivers/Driver.ts index 746216d..83e819c 100644 --- a/src/database/drivers/Driver.ts +++ b/src/database/drivers/Driver.ts @@ -374,6 +374,19 @@ export abstract class Driver { return data } + /** + * Find a value in database or create a new one if it doesn't exist. + */ + public async findOrCreate(data: Partial): Promise { + const hasValue = await this.find() + + if (hasValue) { + return hasValue + } + + return this.create(data) + } + /** * Return a single model instance or, if no results are found, * execute the given closure. diff --git a/src/database/drivers/FakeDriver.ts b/src/database/drivers/FakeDriver.ts index 3ec46aa..93e6ec4 100644 --- a/src/database/drivers/FakeDriver.ts +++ b/src/database/drivers/FakeDriver.ts @@ -373,6 +373,19 @@ export class FakeDriver { return data } + /** + * Find a value in database or create a new one if it doesn't exist. + */ + public static async findOrCreate(data: Partial): Promise { + const hasValue = await this.find() + + if (hasValue) { + return hasValue + } + + return this.create(data) + } + /** * Find a value in database or execute closure. */ diff --git a/src/models/BaseModel.ts b/src/models/BaseModel.ts index bd7d202..db90275 100644 --- a/src/models/BaseModel.ts +++ b/src/models/BaseModel.ts @@ -287,6 +287,23 @@ export class BaseModel { return query.findOrFail() } + /** + * Find a value in database or create a new one if it doesn't exist. + */ + public static async findOrCreate( + this: T, + where: Partial>, + data: Partial> + ): Promise> { + const query = this.query() + + if (where) { + query.where(where) + } + + return query.findOrCreate(data) + } + /** * Return a single data or, if no results are found, * execute the given closure. diff --git a/src/models/builders/ModelQueryBuilder.ts b/src/models/builders/ModelQueryBuilder.ts index 25200b6..31d9e9f 100644 --- a/src/models/builders/ModelQueryBuilder.ts +++ b/src/models/builders/ModelQueryBuilder.ts @@ -258,6 +258,19 @@ export class ModelQueryBuilder< return data } + /** + * Find a value in database or create a new one if it doesn't exist. + */ + public async findOrCreate(data: Partial = {}) { + const hasValue = await this.find() + + if (hasValue) { + return hasValue + } + + return this.create(data) + } + /** * Return a single data or, if no results are found, * execute the given closure.