From a34e8ab61873c3d06803255380e99b49834b2863 Mon Sep 17 00:00:00 2001 From: Jure Triglav <juretriglav@gmail.com> Date: Sat, 8 Aug 2020 01:56:24 +0200 Subject: [PATCH] feat: use relations to link files and their owners --- server/model-file/src/file.js | 42 +++++++++++-------- server/model-file/src/index.js | 4 +- .../src/migrations/1537450834-files.sql | 14 ------- .../src/migrations/1596838897-files.sql | 24 +++++++++++ server/model-file/src/resolvers.js | 1 + server/model-file/src/typeDefs.js | 8 ++-- 6 files changed, 55 insertions(+), 38 deletions(-) delete mode 100644 server/model-file/src/migrations/1537450834-files.sql create mode 100644 server/model-file/src/migrations/1596838897-files.sql diff --git a/server/model-file/src/file.js b/server/model-file/src/file.js index 64284826f7..de10f74af9 100644 --- a/server/model-file/src/file.js +++ b/server/model-file/src/file.js @@ -1,5 +1,4 @@ const BaseModel = require('@pubsweet/base-model') -const logger = require('@pubsweet/logger') class File extends BaseModel { static get tableName() { @@ -11,6 +10,29 @@ class File extends BaseModel { this.type = 'file' } + static get relationMappings() { + const { Manuscript, ReviewComment } = require('@pubsweet/models') + + return { + manuscript: { + relation: BaseModel.BelongsToOneRelation, + modelClass: Manuscript, + join: { + from: 'manuscripts.id', + to: 'files.manuscript_id', + }, + }, + reviewComment: { + relation: BaseModel.BelongsToOneRelation, + modelClass: ReviewComment, + join: { + from: 'review_comments.id', + to: 'files.review_comments_id', + }, + }, + } + } + static get schema() { return { properties: { @@ -20,25 +42,11 @@ class File extends BaseModel { fileType: { type: ['string', 'null'] }, filename: { type: ['string', 'null'] }, size: { type: ['integer', 'null'] }, - object: { type: ['string', 'null'] }, - objectId: { type: 'string', format: 'uuid' }, + reviewCommentId: { type: ['string', 'null'], format: 'uuid' }, + manuscriptId: { type: ['string', 'null'], format: 'uuid' }, }, } } - - static async findByObject({ object, object_id }) { - logger.debug('Finding Files by Object') - - const results = await this.query() - .where('object', object) - .andWhere('object_id', object_id) - - return results - } - - // async $beforeDelete() { - // await Team.deleteAssociated(this.data.type, this.id) - // } } File.type = 'file' diff --git a/server/model-file/src/index.js b/server/model-file/src/index.js index 5f1d108b1e..3146f811a5 100644 --- a/server/model-file/src/index.js +++ b/server/model-file/src/index.js @@ -1,10 +1,8 @@ const resolvers = require('./resolvers') const typeDefs = require('./typeDefs') -const model = require('./file') module.exports = { - model, - modelName: 'File', + models: [{ modelName: 'File', model: require('./file') }], resolvers, typeDefs, } diff --git a/server/model-file/src/migrations/1537450834-files.sql b/server/model-file/src/migrations/1537450834-files.sql deleted file mode 100644 index c18083f7b9..0000000000 --- a/server/model-file/src/migrations/1537450834-files.sql +++ /dev/null @@ -1,14 +0,0 @@ -CREATE TABLE files ( - id UUID PRIMARY KEY, - created TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT current_timestamp, - updated TIMESTAMP WITH TIME ZONE, - object TEXT, - object_id UUID, - label TEXT, - file_type TEXT, - filename TEXT, - url TEXT, - mime_type TEXT, - size INTEGER, - type TEXT NOT NULL -); \ No newline at end of file diff --git a/server/model-file/src/migrations/1596838897-files.sql b/server/model-file/src/migrations/1596838897-files.sql new file mode 100644 index 0000000000..f823bc1ce8 --- /dev/null +++ b/server/model-file/src/migrations/1596838897-files.sql @@ -0,0 +1,24 @@ +CREATE TABLE files ( + id UUID PRIMARY KEY, + created TIMESTAMP WITH TIME ZONE NOT NULL DEFAULT current_timestamp, + updated TIMESTAMP WITH TIME ZONE, + -- object_type TEXT, + -- object_id UUID, + label TEXT, + file_type TEXT, + filename TEXT, + url TEXT, + mime_type TEXT, + size INTEGER, + type TEXT NOT NULL, + -- Things that can have files + manuscript_id UUID REFERENCES manuscripts(id) ON DELETE CASCADE, + review_comment_id UUID REFERENCES review_comments(id) ON DELETE CASCADE, + + constraint exactly_one_file_owner check( + ( + (manuscript_id is not null)::integer + + (review_comment_id is not null)::integer + ) = 1 + ) +); \ No newline at end of file diff --git a/server/model-file/src/resolvers.js b/server/model-file/src/resolvers.js index da8ea91c7c..aa7af76dba 100644 --- a/server/model-file/src/resolvers.js +++ b/server/model-file/src/resolvers.js @@ -32,6 +32,7 @@ const resolvers = { const path = await upload(file) meta.url = `/static/${path}` const data = await new File(meta).save() + return data }, }, diff --git a/server/model-file/src/typeDefs.js b/server/model-file/src/typeDefs.js index 34050c96a9..d9d84614fc 100644 --- a/server/model-file/src/typeDefs.js +++ b/server/model-file/src/typeDefs.js @@ -8,8 +8,8 @@ const typeDefs = ` fileType: String filename: String mimeType: String - object: String - objectId: ID! + manuscriptId: ID + reviewCommentId: ID label: String size: Int } @@ -18,8 +18,8 @@ const typeDefs = ` id: ID! created: DateTime! updated: DateTime - object: String - objectId: ID! + manuscriptId: ID + reviewCommentId: ID label: String fileType: String filename: String -- GitLab