diff --git a/packages/backend/src/db/migrations/20250124105728_create_folders.js b/packages/backend/src/db/migrations/20250124105728_create_folders.js new file mode 100644 index 00000000..60a9f784 --- /dev/null +++ b/packages/backend/src/db/migrations/20250124105728_create_folders.js @@ -0,0 +1,13 @@ +export async function up(knex) { + return knex.schema.createTable('folders', (table) => { + table.uuid('id').primary().defaultTo(knex.raw('gen_random_uuid()')); + table.string('name'); + table.uuid('user_id').references('id').inTable('users'); + + table.timestamps(true, true); + }); +} + +export async function down(knex) { + return knex.schema.dropTable('folders'); +} diff --git a/packages/backend/src/models/__snapshots__/folder.test.js.snap b/packages/backend/src/models/__snapshots__/folder.test.js.snap new file mode 100644 index 00000000..ede97dfe --- /dev/null +++ b/packages/backend/src/models/__snapshots__/folder.test.js.snap @@ -0,0 +1,27 @@ +// Vitest Snapshot v1, https://vitest.dev/guide/snapshot.html + +exports[`Folder model > jsonSchema should have correct validations 1`] = ` +{ + "properties": { + "createdAt": { + "type": "string", + }, + "id": { + "format": "uuid", + "type": "string", + }, + "name": { + "minLength": 1, + "type": "string", + }, + "updatedAt": { + "type": "string", + }, + "userId": { + "format": "uuid", + "type": "string", + }, + }, + "type": "object", +} +`; diff --git a/packages/backend/src/models/folder.js b/packages/backend/src/models/folder.js new file mode 100644 index 00000000..96eec5ef --- /dev/null +++ b/packages/backend/src/models/folder.js @@ -0,0 +1,30 @@ +import Base from './base.js'; +import User from './user.js'; + +class Folder extends Base { + static tableName = 'folders'; + + static jsonSchema = { + type: 'object', + properties: { + id: { type: 'string', format: 'uuid' }, + name: { type: 'string', minLength: 1 }, + userId: { type: 'string', format: 'uuid' }, + createdAt: { type: 'string' }, + updatedAt: { type: 'string' }, + }, + }; + + static relationMappings = () => ({ + user: { + relation: Base.BelongsToOneRelation, + modelClass: User, + join: { + from: 'folders.user_id', + to: 'users.id', + }, + }, + }); +} + +export default Folder; diff --git a/packages/backend/src/models/folder.test.js b/packages/backend/src/models/folder.test.js new file mode 100644 index 00000000..3fada770 --- /dev/null +++ b/packages/backend/src/models/folder.test.js @@ -0,0 +1,31 @@ +import { describe, it, expect } from 'vitest'; +import Folder from './folder'; +import User from './user'; +import Base from './base'; + +describe('Folder model', () => { + it('tableName should return correct name', () => { + expect(Folder.tableName).toBe('folders'); + }); + + it('jsonSchema should have correct validations', () => { + expect(Folder.jsonSchema).toMatchSnapshot(); + }); + + it('relationMappings should return correct associations', () => { + const relationMappings = Folder.relationMappings(); + + const expectedRelations = { + user: { + relation: Base.BelongsToOneRelation, + modelClass: User, + join: { + from: 'folders.user_id', + to: 'users.id', + }, + }, + }; + + expect(relationMappings).toStrictEqual(expectedRelations); + }); +});