diff --git a/backend/strapi/src/api/note/content-types/note/schema.json b/backend/strapi/src/api/note/content-types/note/schema.json index e064764..754f73c 100644 --- a/backend/strapi/src/api/note/content-types/note/schema.json +++ b/backend/strapi/src/api/note/content-types/note/schema.json @@ -22,7 +22,8 @@ "owners": { "type": "relation", "relation": "manyToMany", - "target": "plugin::users-permissions.user" + "target": "plugin::users-permissions.user", + "mappedBy": "notes" }, "lastViewed": { "type": "datetime", diff --git a/backend/strapi/src/api/note/controllers/note.js b/backend/strapi/src/api/note/controllers/note.js index fdc5a92..20de73a 100644 --- a/backend/strapi/src/api/note/controllers/note.js +++ b/backend/strapi/src/api/note/controllers/note.js @@ -1,5 +1,6 @@ 'use strict'; //move to utils! + function getNoteIdFromUrl(url) { return Number(url.split("/").at(-1)); } @@ -43,7 +44,6 @@ module.exports = createCoreController(noteUid, ({strapi}) => ({ populate: ['owners'], }); const authorized = entry.owners.some(owner => owner.id === userId) - console.log(authorized) if (authorized) { entry = await strapi.entityService.update(noteUid, noteId, { data: { @@ -68,18 +68,37 @@ module.exports = createCoreController(noteUid, ({strapi}) => ({ populate: ['owners'], }); const authorized = entry.owners.some(owner => owner.id === userId) - let allowed; + let allPreviousOwnersKept = false; if (requestBody.data.hasOwnProperty("owners")) { - allowed = entry.owners.every(owner => requestBody.data.owners.includes(owner)); + allPreviousOwnersKept = entry.owners.every(owner => requestBody.data.owners.includes(owner)); } if (!authorized) { ctx.response.status = 403; - } else if (!allowed) { + } else if (!allPreviousOwnersKept) { ctx.response.status = 400; } else { return super.update(ctx); } }, + /** + * Creates a new note, automatically sets owners to the user making the request and lastViewed + * @param ctx + * @returns {Promise} + */ + async create(ctx) { + const userId = ctx.state.user.id; + const requestBody = ctx.request.body; + const response = await strapi.entityService.create(noteUid, { + data: { + title: requestBody.data.title, + content: requestBody.data.content, + lastViewed: Date.now(), + owners: [userId], + publishedAt: Date.now() + } + }); + return response; + }, /** * Deletes user from note owners. If note has no owners anymore, deletes note. * @param ctx diff --git a/frontend/svelte/src/models/NoteRepository.ts b/frontend/svelte/src/models/NoteRepository.ts index 1cae27d..c83d5a6 100644 --- a/frontend/svelte/src/models/NoteRepository.ts +++ b/frontend/svelte/src/models/NoteRepository.ts @@ -4,7 +4,7 @@ export interface NoteRepository { getNotes(): Promise; getNote(id: number): Promise; getCurrentNote(): Promise; - updateNote(id: number, note: Note): Promise; + updateNote(id: number, note: Partial): Promise; deleteNote(id: number): void; - createNote(note: Note): Promise; + createNote(note: Partial & Pick): Promise; } \ No newline at end of file diff --git a/frontend/svelte/src/models/StrapiNoteRepository.ts b/frontend/svelte/src/models/StrapiNoteRepository.ts index f167ce1..9de32cd 100644 --- a/frontend/svelte/src/models/StrapiNoteRepository.ts +++ b/frontend/svelte/src/models/StrapiNoteRepository.ts @@ -19,12 +19,12 @@ export class StrapiNoteRepository implements NoteRepository { private static apiNoteEndpoint: string = "http://localhost:1337/api/notes" public async getNotes(): Promise{ - const response = await StrapiNoteRepository.fetchStrapi("/", 'GET'); + const response = await StrapiNoteRepository.fetchStrapiNoteEndpoint("/", 'GET'); return await response.json(); } public async getNote(id: number): Promise{ - const response = await StrapiNoteRepository.fetchStrapi("/" + id, 'GET'); + const response = await StrapiNoteRepository.fetchStrapiNoteEndpoint("/" + id, 'GET'); return await response.json(); } @@ -35,21 +35,21 @@ export class StrapiNoteRepository implements NoteRepository { return await this.getNote(this.currentNoteId); } - public async updateNote(id: number, note: Note): Promise { - const response = await StrapiNoteRepository.fetchStrapi("/" + id, 'PUT', note); + public async updateNote(id: number, note: Partial): Promise { + const response = await StrapiNoteRepository.fetchStrapiNoteEndpoint("/" + id, 'PUT', note); return await response.json(); } - public async createNote(note: Note): Promise { - const response = await StrapiNoteRepository.fetchStrapi("/", 'POST', note); + public async createNote(note: Partial & Pick): Promise { + const response = await StrapiNoteRepository.fetchStrapiNoteEndpoint("/", 'POST', note); return await response.json(); } public async deleteNote(id: number): Promise { - await StrapiNoteRepository.fetchStrapi("/" + id, 'DELETE'); + await StrapiNoteRepository.fetchStrapiNoteEndpoint("/" + id, 'DELETE'); } - private static async fetchStrapi(path: string, method: HttpMethod, body: Note | null = null): Promise { + private static async fetchStrapiNoteEndpoint(path: string, method: HttpMethod, body: Partial | null = null): Promise { let requestInit: RequestInit = { method: method, headers: { diff --git a/frontend/svelte/src/models/types.ts b/frontend/svelte/src/models/types.ts index 5cb5ca9..0b0e8aa 100644 --- a/frontend/svelte/src/models/types.ts +++ b/frontend/svelte/src/models/types.ts @@ -2,6 +2,5 @@ export interface Note { id: number; title: string; content: string; - lastViewed: Date; } \ No newline at end of file