From 057bcdcf0214637d2199dedf25b70e096eaea3aa Mon Sep 17 00:00:00 2001 From: j-weissen Date: Tue, 4 Oct 2022 11:24:20 +0200 Subject: [PATCH 1/4] converted to Partials --- frontend/svelte/src/models/NoteRepository.ts | 6 +++--- frontend/svelte/src/models/StrapiNoteRepository.ts | 8 ++++---- 2 files changed, 7 insertions(+), 7 deletions(-) diff --git a/frontend/svelte/src/models/NoteRepository.ts b/frontend/svelte/src/models/NoteRepository.ts index 421ffce..c83d5a6 100644 --- a/frontend/svelte/src/models/NoteRepository.ts +++ b/frontend/svelte/src/models/NoteRepository.ts @@ -1,10 +1,10 @@ -import type {Note} from "../types"; +import type {Note} from "./types"; 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 86fb1a7..22c4a16 100644 --- a/frontend/svelte/src/models/StrapiNoteRepository.ts +++ b/frontend/svelte/src/models/StrapiNoteRepository.ts @@ -1,4 +1,4 @@ -import type {Note} from "../types"; +import type {Note} from "./types"; import {parseCookies} from "nookies"; import type {NoteRepository} from "./NoteRepository"; @@ -35,12 +35,12 @@ export class StrapiNoteRepository implements NoteRepository { return await this.getNote(this.currentNoteId); } - public async updateNote(id: number, note: Note): Promise { + public async updateNote(id: number, note: Partial): Promise { const response = await StrapiNoteRepository.fetchStrapi("/" + id, 'PUT', note); return await response.json(); } - public async createNote(note: Note): Promise { + public async createNote(note: Partial & Pick): Promise { const response = await StrapiNoteRepository.fetchStrapi("/", 'POST', note); return await response.json(); } @@ -49,7 +49,7 @@ export class StrapiNoteRepository implements NoteRepository { await StrapiNoteRepository.fetchStrapi("/" + id, 'DELETE'); } - private static async fetchStrapi(path: string, method: HttpMethod, body: Note | null = null): Promise { + private static async fetchStrapi(path: string, method: HttpMethod, body: Partial | null = null): Promise { let requestInit: RequestInit = { method: method, headers: { From aa65cead2e1fa3ed62b75b3c071069c1b8912549 Mon Sep 17 00:00:00 2001 From: sprechtl Date: Mon, 10 Oct 2022 00:07:34 +0200 Subject: [PATCH 2/4] changed type path --- frontend/svelte/src/models/NoteRepository.ts | 2 +- frontend/svelte/src/models/StrapiNoteRepository.ts | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/svelte/src/models/NoteRepository.ts b/frontend/svelte/src/models/NoteRepository.ts index 421ffce..1cae27d 100644 --- a/frontend/svelte/src/models/NoteRepository.ts +++ b/frontend/svelte/src/models/NoteRepository.ts @@ -1,4 +1,4 @@ -import type {Note} from "../types"; +import type {Note} from "./types"; export interface NoteRepository { getNotes(): Promise; diff --git a/frontend/svelte/src/models/StrapiNoteRepository.ts b/frontend/svelte/src/models/StrapiNoteRepository.ts index 86fb1a7..8b3f668 100644 --- a/frontend/svelte/src/models/StrapiNoteRepository.ts +++ b/frontend/svelte/src/models/StrapiNoteRepository.ts @@ -1,4 +1,4 @@ -import type {Note} from "../types"; +import type {Note} from "./types"; import {parseCookies} from "nookies"; import type {NoteRepository} from "./NoteRepository"; From 81f0aadd3961ca4be1a1fc267e25edd9c23971e1 Mon Sep 17 00:00:00 2001 From: j-weissen Date: Mon, 10 Oct 2022 20:24:27 +0200 Subject: [PATCH 3/4] custom note create implemented, note <-> user relation fixed --- .../api/note/content-types/note/schema.json | 3 ++- .../strapi/src/api/note/controllers/note.js | 27 ++++++++++++++++--- 2 files changed, 25 insertions(+), 5 deletions(-) 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 From 02d5aa02639385b37bdd4749a453ab40fb510d3e Mon Sep 17 00:00:00 2001 From: j-weissen Date: Mon, 10 Oct 2022 20:30:09 +0200 Subject: [PATCH 4/4] Note interface changed, Repo create fixed --- frontend/svelte/src/models/StrapiNoteRepository.ts | 12 ++++++------ frontend/svelte/src/models/types.ts | 5 ----- 2 files changed, 6 insertions(+), 11 deletions(-) diff --git a/frontend/svelte/src/models/StrapiNoteRepository.ts b/frontend/svelte/src/models/StrapiNoteRepository.ts index 22c4a16..760edbd 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(); } @@ -36,20 +36,20 @@ export class StrapiNoteRepository implements NoteRepository { } public async updateNote(id: number, note: Partial): Promise { - const response = await StrapiNoteRepository.fetchStrapi("/" + id, 'PUT', note); + const response = await StrapiNoteRepository.fetchStrapiNoteEndpoint("/" + id, 'PUT', note); return await response.json(); } public async createNote(note: Partial & Pick): Promise { - const response = await StrapiNoteRepository.fetchStrapi("/", 'POST', note); + 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: Partial | 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 5ded795..0b0e8aa 100644 --- a/frontend/svelte/src/models/types.ts +++ b/frontend/svelte/src/models/types.ts @@ -1,11 +1,6 @@ export interface Note { id: number; - attributes: Attribute; -} - -export interface Attribute { title: string; content: string; - lastViewed: Date; } \ No newline at end of file