diff --git a/README.md b/README.md deleted file mode 100644 index ad0dcce..0000000 --- a/README.md +++ /dev/null @@ -1,19 +0,0 @@ -# 🚀 Getting started with PomeloNote -### **THIS REPOSITORY HAS DEPENDENCIES WITH SECURITY VULNERABILITIES. YOU MIGHT WANT TO UPDATE PACKAGES BEFORE USE.** -## Setup -- run `npm i` -- get the .env file and save it to the root directory of the project -- set up Strapi - - go to `localhost:1337/admin` - - register an admin user - - go to Settings => Users&Permissions Plugin => Roles => Authenticated => Note => Select all - - Save - -### Starting the container with svelte and strapi: -``docker-compose up --build -d`` - -### Restart and rebuild Svelte: -``docker-compose up --detach --build svelte`` - -### Restart and rebuild Strapi: -``docker-compose up --detach --build strapi`` diff --git a/docker-compose.yml b/backend/strapi/docker-compose.yml similarity index 72% rename from docker-compose.yml rename to backend/strapi/docker-compose.yml index 34e7feb..8a2c9ab 100644 --- a/docker-compose.yml +++ b/backend/strapi/docker-compose.yml @@ -2,7 +2,7 @@ version: "3" services: strapi: container_name: strapi - build: ./backend/strapi + build: . image: mystrapi:latest restart: unless-stopped env_file: .env @@ -17,11 +17,11 @@ services: DATABASE_PASSWORD: ${DATABASE_PASSWORD} NODE_ENV: ${NODE_ENV} volumes: - - ./backend/strapi/config:/opt/app/config - - ./backend/strapi/src:/opt/app/src - - ./backend/strapi/package.json:/opt/package.json - - ./backend/strapi/yarn.lock:/opt/yarn.lock # Replace with package-lock.json if using npm - - ./backend/strapi/.env:/opt/app/.env + - ./config:/opt/app/config + - ./src:/opt/app/src + - ./package.json:/opt/package.json + - ./yarn.lock:/opt/yarn.lock # Replace with package-lock.json if using npm + - ./.env:/opt/app/.env ports: - "1337:1337" networks: @@ -47,21 +47,10 @@ services: networks: - strapi - svelte: - container_name: svelte - build: ./frontend/svelte - image: svelte:latest - - ports: - - "80:5173" - volumes: - strapi-data: + strapi-data: networks: strapi: name: Strapi driver: bridge - - - 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 754f73c..82d431e 100644 --- a/backend/strapi/src/api/note/content-types/note/schema.json +++ b/backend/strapi/src/api/note/content-types/note/schema.json @@ -4,8 +4,7 @@ "info": { "singularName": "note", "pluralName": "notes", - "displayName": "note", - "description": "" + "displayName": "note" }, "options": { "draftAndPublish": true @@ -21,9 +20,8 @@ }, "owners": { "type": "relation", - "relation": "manyToMany", - "target": "plugin::users-permissions.user", - "mappedBy": "notes" + "relation": "oneToMany", + "target": "admin::user" }, "lastViewed": { "type": "datetime", diff --git a/backend/strapi/src/api/note/controllers/note.js b/backend/strapi/src/api/note/controllers/note.js index 84e7a8d..0828a87 100644 --- a/backend/strapi/src/api/note/controllers/note.js +++ b/backend/strapi/src/api/note/controllers/note.js @@ -1,138 +1,9 @@ 'use strict'; -//move to utils! - -function getNoteIdFromUrl(url) { - return Number(url.split("/").at(-1)); -} /** * note controller */ -const noteUid = 'api::note.note'; -const {createCoreController} = require('@strapi/strapi').factories; -module.exports = createCoreController(noteUid, ({strapi}) => ({ - /** - * Gives all, to the user related, notes. - * @param ctx - * @returns {Promise} - */ - async find(ctx) { - const userId = ctx.state.user.id; - const entries = await strapi.entityService.findMany(noteUid, { - populate: ['owners'], - filters: { - owners: { - id: userId - } - }, - sort: { - lastViewed: 'desc' - } - }); - return JSON.stringify(entries); - }, - /** - * Finds the note by id and updates lastViewed. Exits 403 if the note does not belong to the user making the request. - * @param ctx - * @returns {Promise} - */ - async findOne(ctx) { - const noteId = getNoteIdFromUrl(ctx.request.url); - const userId = ctx.state.user.id; - let entry = await strapi.entityService.findOne(noteUid, noteId, { - populate: ['owners'], - }); - const authorized = entry.owners.some(owner => owner.id === userId) - if (authorized) { - entry = await strapi.entityService.update(noteUid, noteId, { - data: { - lastViewed: Date.now() - } - }) - entry = await strapi.entityService.findOne(noteUid, noteId, { - populate: ['owners'], - }); - return JSON.stringify(entry); - } else { - ctx.response.status = 403; - } - }, - /** - * Updates note. Removing owners is an illegal operation (400) - * @param ctx - * @returns {Promise} - */ - async update(ctx) { - const noteId = getNoteIdFromUrl(ctx.request.url) - const userId = ctx.state.user.id; - const requestBody = JSON.parse(ctx.request.body); - console.log(JSON.stringify(requestBody, null, 2)) - const entry = await strapi.entityService.findOne(noteUid, noteId, { - populate: ['owners'], - }); - const authorized = entry.owners.some(owner => owner.id === userId) - let allPreviousOwnersKept = true; - if (requestBody.data.hasOwnProperty("owners")) { - allPreviousOwnersKept = entry.owners.every(owner => requestBody.data.owners.includes(owner)); - } - console.log({ - "auth": authorized, - "allprev": allPreviousOwnersKept, - }) - if (!authorized) { - ctx.response.status = 403; - } else if (!allPreviousOwnersKept) { - ctx.response.status = 400; - } - return await strapi.entityService.update(noteUid, noteId, requestBody); - }, - /** - * 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 = JSON.parse(ctx.request.body); - console.log(requestBody); - 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 - * @returns nothing - */ - async delete(ctx) { - const noteId = getNoteIdFromUrl(ctx.request.url) - const userId = ctx.state.user.id; - const entry = await strapi.entityService.findOne(noteUid, noteId, { - populate: ['owners'], - }); - const ownersCount = entry.owners.length; - const authorized = entry.owners.some(owner => owner.id === userId) - if (!authorized) { - ctx.response.status = 403; - return; - } - if (ownersCount === 1) { - super.delete(ctx); - } else { - strapi.entityService.update(noteUid, noteId, { - data: { - owners: entry.owners.filter(owner => owner.id !== userId) - } - }) - } - ctx.response.status = 200; - } -})); +const { createCoreController } = require('@strapi/strapi').factories; + +module.exports = createCoreController('api::note.note'); diff --git a/backend/strapi/src/api/note/utils.js b/backend/strapi/src/api/note/utils.js deleted file mode 100644 index 63a054e..0000000 --- a/backend/strapi/src/api/note/utils.js +++ /dev/null @@ -1,3 +0,0 @@ -function getNoteIdFromUrl(url) { - return Number(url.split("/").at(-1)); -} diff --git a/backend/strapi/src/extensions/users-permissions/content-types/user/schema.json b/backend/strapi/src/extensions/users-permissions/content-types/user/schema.json deleted file mode 100644 index 7413352..0000000 --- a/backend/strapi/src/extensions/users-permissions/content-types/user/schema.json +++ /dev/null @@ -1,73 +0,0 @@ -{ - "kind": "collectionType", - "collectionName": "up_users", - "info": { - "name": "user", - "description": "", - "singularName": "user", - "pluralName": "users", - "displayName": "User" - }, - "options": { - "draftAndPublish": false, - "timestamps": true - }, - "attributes": { - "username": { - "type": "string", - "minLength": 3, - "unique": true, - "configurable": false, - "required": true - }, - "email": { - "type": "email", - "minLength": 6, - "configurable": false, - "required": true - }, - "provider": { - "type": "string", - "configurable": false - }, - "password": { - "type": "password", - "minLength": 6, - "configurable": false, - "private": true - }, - "resetPasswordToken": { - "type": "string", - "configurable": false, - "private": true - }, - "confirmationToken": { - "type": "string", - "configurable": false, - "private": true - }, - "confirmed": { - "type": "boolean", - "default": false, - "configurable": false - }, - "blocked": { - "type": "boolean", - "default": false, - "configurable": false - }, - "role": { - "type": "relation", - "relation": "manyToOne", - "target": "plugin::users-permissions.role", - "inversedBy": "users", - "configurable": false - }, - "notes": { - "type": "relation", - "relation": "manyToMany", - "target": "api::note.note", - "inversedBy": "owners" - } - } -} diff --git a/docs/_config.yml b/docs/_config.yml deleted file mode 100644 index 2e92aba..0000000 --- a/docs/_config.yml +++ /dev/null @@ -1,3 +0,0 @@ -remote_theme: pages-themes/leap-day@v0.2.0 -plugins: -- jekyll-remote-theme diff --git a/docs/_data/devs.csv b/docs/_data/devs.csv deleted file mode 100644 index 5c60b6c..0000000 --- a/docs/_data/devs.csv +++ /dev/null @@ -1,4 +0,0 @@ -name,github,image -Jonas Weissengruber,j-weissen,jowei -Stefan Prechtler,s-prechtl,stef -David Hain,d-hain,dave \ No newline at end of file diff --git a/docs/images/dave.jpg b/docs/images/dave.jpg deleted file mode 100644 index 9fe6268..0000000 Binary files a/docs/images/dave.jpg and /dev/null differ diff --git a/docs/images/delete.png b/docs/images/delete.png deleted file mode 100644 index 39ae1b5..0000000 Binary files a/docs/images/delete.png and /dev/null differ diff --git a/docs/images/editor.png b/docs/images/editor.png deleted file mode 100644 index 690ef69..0000000 Binary files a/docs/images/editor.png and /dev/null differ diff --git a/docs/images/jowei.jpg b/docs/images/jowei.jpg deleted file mode 100644 index 6785c8d..0000000 Binary files a/docs/images/jowei.jpg and /dev/null differ diff --git a/docs/images/listing.png b/docs/images/listing.png deleted file mode 100644 index 8b1189b..0000000 Binary files a/docs/images/listing.png and /dev/null differ diff --git a/docs/images/login.png b/docs/images/login.png deleted file mode 100644 index e9c1cbd..0000000 Binary files a/docs/images/login.png and /dev/null differ diff --git a/docs/images/register.png b/docs/images/register.png deleted file mode 100644 index 68336c8..0000000 Binary files a/docs/images/register.png and /dev/null differ diff --git a/docs/images/stef.jpg b/docs/images/stef.jpg deleted file mode 100644 index 231d3e3..0000000 Binary files a/docs/images/stef.jpg and /dev/null differ diff --git a/docs/index.md b/docs/index.md deleted file mode 100644 index 7c87e05..0000000 --- a/docs/index.md +++ /dev/null @@ -1,31 +0,0 @@ -# Pomelo Note - -This is the best open source note app you will ever find. - -## Login -When first entering the app, you will need to login. If you haven't got an account you may consider [registering](#register), or just not using the app at all. -
- -## Register -A username, an email and a password that's all you need. If you are missing one of those, just don't use the app at all. -
- -## Editor -You can edit your notes with our minimalistic editor interface. -
- -## Listing -Here you can see all your notes. Click on them to open the editor or hover and press the red "X" to delete them. -
- -## Delete -Confirm the deletion. -
- -# The Team -{% for dev in site.data.devs %} - {{ dev.name }} - [GitHub](https://github.com/{{ dev.github }}) - ![{{ dev.name }}](images/{{ dev.image }}.jpg) -{% endfor %} - diff --git a/frontend/svelte/README.md b/frontend/svelte/README.md index 02b9db1..d443f6b 100644 --- a/frontend/svelte/README.md +++ b/frontend/svelte/README.md @@ -1,7 +1,13 @@ -# 🚀 Getting started with Svelte +# Creating the svelte project -### Starting the container: -``docker-compose up --build -d`` +## Create the docker image -### Restart and rebuild Svelte: -``docker-compose up --detach --build svelte`` +``docker build -t svelte .`` + +## Run the docker container + +``docker run --name svelte -dp 5173:5173 svelte`` + +## Mastercommand for rebuild run etc. + +``docker build -t svelte .;docker stop svelte;docker rm svelte; docker run --name svelte -dp 5173:5173 svelte`` \ No newline at end of file diff --git a/frontend/svelte/docker-compose.yml b/frontend/svelte/docker-compose.yml deleted file mode 100644 index d9cda87..0000000 --- a/frontend/svelte/docker-compose.yml +++ /dev/null @@ -1,9 +0,0 @@ -version: "3" -services: - svelte: - container_name: svelte - build: . - image: svelte:latest - - ports: - - "80:5173" diff --git a/frontend/svelte/package-lock.json b/frontend/svelte/package-lock.json index d5c5126..beb453c 100644 --- a/frontend/svelte/package-lock.json +++ b/frontend/svelte/package-lock.json @@ -8,10 +8,10 @@ "name": "svelte_pages", "version": "0.0.1", "dependencies": { - "bootstrap-icons": "^1.9.1", - "nookies": "^2.5.2", - "sv-popup": "^0.2.5", - "webworker": "^0.8.4" + "bootstrap-icons": "^1.9.1" + }, + "dependencies": { + "nookies": "^2.5.2" }, "devDependencies": { "@sveltejs/adapter-auto": "next", @@ -2085,11 +2085,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/sv-popup": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/sv-popup/-/sv-popup-0.2.5.tgz", - "integrity": "sha512-JhBu4piXaauamT4vMEcFCydvxJ8e72G7c9F3caZVAPsiFqWPTYT3JDz99FlR+YCnbOp1emsZqqOPVvCwHgURog==" - }, "node_modules/svelte": { "version": "3.50.1", "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.50.1.tgz", @@ -2365,14 +2360,6 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "dev": true }, - "node_modules/webworker": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/webworker/-/webworker-0.8.4.tgz", - "integrity": "sha512-zzsVxtHf+mCn0WuYLarSWfRGmX7JiYKkKvso5FYC7rJ9G8svwGQA5a51Sjq9D2c/rKVU6U/kyBcaI7gUTVlsJg==", - "engines": { - "node": ">=0.4.3" - } - }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -3839,11 +3826,6 @@ "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", "dev": true }, - "sv-popup": { - "version": "0.2.5", - "resolved": "https://registry.npmjs.org/sv-popup/-/sv-popup-0.2.5.tgz", - "integrity": "sha512-JhBu4piXaauamT4vMEcFCydvxJ8e72G7c9F3caZVAPsiFqWPTYT3JDz99FlR+YCnbOp1emsZqqOPVvCwHgURog==" - }, "svelte": { "version": "3.50.1", "resolved": "https://registry.npmjs.org/svelte/-/svelte-3.50.1.tgz", @@ -4001,11 +3983,6 @@ "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", "dev": true }, - "webworker": { - "version": "0.8.4", - "resolved": "https://registry.npmjs.org/webworker/-/webworker-0.8.4.tgz", - "integrity": "sha512-zzsVxtHf+mCn0WuYLarSWfRGmX7JiYKkKvso5FYC7rJ9G8svwGQA5a51Sjq9D2c/rKVU6U/kyBcaI7gUTVlsJg==" - }, "whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", diff --git a/frontend/svelte/package.json b/frontend/svelte/package.json index 81a0887..441ef4a 100644 --- a/frontend/svelte/package.json +++ b/frontend/svelte/package.json @@ -22,9 +22,6 @@ }, "type": "module", "dependencies": { - "bootstrap-icons": "^1.9.1", - "nookies": "^2.5.2", - "sv-popup": "^0.2.5", - "webworker": "^0.8.4" + "nookies": "^2.5.2" } } diff --git a/frontend/svelte/src/app.html b/frontend/svelte/src/app.html index 9d5ca24..2767694 100644 --- a/frontend/svelte/src/app.html +++ b/frontend/svelte/src/app.html @@ -1,13 +1,12 @@ - + - %sveltekit.head%
%sveltekit.body%
- \ No newline at end of file + diff --git a/frontend/svelte/src/customBootstrap.css b/frontend/svelte/src/customBootstrap.css deleted file mode 100644 index 311d8a4..0000000 --- a/frontend/svelte/src/customBootstrap.css +++ /dev/null @@ -1,29 +0,0 @@ - -html, -:root { - --main-txt-color: black; - --cross-txt-color: red; - - --color-primary: #fff494; - --color-primary-600: #fff17a; - --color-primary-700: #ffec47; - --color-primary-800: #ffe714; - --color-primary-900: #e0c900; -} - -.btn-primary { - background-color: var(--color-primary-800) !important; - border: var(--color-primary-800) !important; - color: var(--main-txt-color) !important; -} - -.btn-primary:hover { - background-color: var(--color-primary-900) !important; - border: var(--color-primary-900) !important; - color: var(--main-txt-color) !important; -} - -.btn-primary:disabled { - background-color: var(--color-primary-700) !important; - border: var(--color-primary-700) !important; -} \ No newline at end of file diff --git a/frontend/svelte/src/models/PomeloUtils.ts b/frontend/svelte/src/models/PomeloUtils.ts index cfec11b..62c9903 100644 --- a/frontend/svelte/src/models/PomeloUtils.ts +++ b/frontend/svelte/src/models/PomeloUtils.ts @@ -1,6 +1,3 @@ -import type {Authentication} from "./authentication"; -import {createErrorToast} from "./customToasts"; - /** * Capitalises first letter of string. * @param str @@ -21,16 +18,4 @@ export async function bearerFetch(endpoint: string, jwt: string, baseUrl: string Authorization: `Bearer ${jwt}` } }); -} - -export function handleErrorsFromResponseWithToast(response: Authentication) { - if (response.error != null) { - if (response.error.details.errors) { - for (const error of response.error.details.errors) { - createErrorToast(error.message); - } - } else { - createErrorToast(response.error.message); - } - } } \ No newline at end of file diff --git a/frontend/svelte/src/models/repos/note/NoteRepository.ts b/frontend/svelte/src/models/repos/note/NoteRepository.ts deleted file mode 100644 index 84b6705..0000000 --- a/frontend/svelte/src/models/repos/note/NoteRepository.ts +++ /dev/null @@ -1,10 +0,0 @@ -import type {Note} from "../../types"; - -export interface NoteRepository { - getNotes(): Promise; - getNote(id: number): Promise; - getCurrentNote(): Promise; - updateNote(id: number, note: Partial): Promise; - deleteNote(id: number): void; - createNote(note: Partial & Pick): Promise; -} \ No newline at end of file diff --git a/frontend/svelte/src/models/repos/note/StrapiNoteRepository.ts b/frontend/svelte/src/models/repos/note/StrapiNoteRepository.ts deleted file mode 100644 index 4043bbf..0000000 --- a/frontend/svelte/src/models/repos/note/StrapiNoteRepository.ts +++ /dev/null @@ -1,86 +0,0 @@ -import type {Note} from "../../types"; -import {parseCookies} from "nookies"; -import type {NoteRepository} from "./NoteRepository"; -import {currentNoteId} from "../../../stores"; - - -type HttpMethod = 'GET' | 'POST' | 'PUT' | 'DELETE' - -export class StrapiNoteRepository implements NoteRepository { - private static instance: StrapiNoteRepository; - public static getInstance(): StrapiNoteRepository { - if (this.instance === undefined || this.instance === null) { - this.instance = new StrapiNoteRepository(); - } - return this.instance; - } - - private constructor() { - currentNoteId.subscribe((value) => (this._currentNoteId = value)); - } - - private _currentNoteId: unknown; - private static apiNoteEndpoint: string = "http://localhost:1337/api/notes" - - public set currentNoteId(value: number | undefined) { - currentNoteId.set(value || -1); - } - - public get currentNoteId(): number { - return this._currentNoteId; - } - - public async getNotes(): Promise{ - const response = await StrapiNoteRepository.fetchStrapiNoteEndpoint("/", 'GET'); - return await response.json(); - } - - public async getNote(id: number): Promise{ - const response = await StrapiNoteRepository.fetchStrapiNoteEndpoint("/" + id, 'GET'); - return await response.json(); - } - - public async getCurrentNote(): Promise { - if (this._currentNoteId === null || this._currentNoteId === undefined) { - return; - } - return await this.getNote(this.currentNoteId); - } - - public async updateNote(id: number, note: Partial): Promise { - const response = await StrapiNoteRepository.fetchStrapiNoteEndpoint("/" + id, 'PUT', note); - return await response.json(); - } - - 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.fetchStrapiNoteEndpoint("/" + id, 'DELETE'); - } - - private static async fetchStrapiNoteEndpoint(path: string, method: HttpMethod, body: Partial | null = null): Promise { - let requestInit: RequestInit = { - method: method, - headers: { - authorization: StrapiNoteRepository.getAuthorizationHeader() - } - }; - if (body) { - requestInit["body"] = JSON.stringify({data: body}); - } - return await fetch(StrapiNoteRepository.apiNoteEndpoint + path, requestInit); - } - - private static mockedGetAuthorizationHeader() { - return "bearer TOKEN" - } - - static getAuthorizationHeader() { - // @ts-ignore - const jwt = parseCookies('/').jwt; - return `bearer ${jwt}` - } -} \ No newline at end of file diff --git a/frontend/svelte/src/models/repos/user/StrapiUserRepo.ts b/frontend/svelte/src/models/repos/user/StrapiUserRepo.ts deleted file mode 100644 index 58f2ea2..0000000 --- a/frontend/svelte/src/models/repos/user/StrapiUserRepo.ts +++ /dev/null @@ -1,93 +0,0 @@ -import type {UserRepository} from "./UserRepository"; -import type {Authentication} from "../../authentication"; -import type {HttpMethod} from "@sveltejs/kit/types/private"; -import {StrapiNoteRepository} from "../note/StrapiNoteRepository"; -import {error} from "@sveltejs/kit"; -import {User} from "../../user"; - -export class StrapiUserRepo implements UserRepository { - private static instance: StrapiUserRepo; - - public static getInstance(verification: boolean = true): StrapiUserRepo { - if (this.instance === undefined || this.instance === null) { - this.instance = new StrapiUserRepo(); - this.instance.verify().then(() => { - if (verification && !this.instance.verified) { - window.location.href = "/login"; - } - }); - } - return this.instance; - } - - private verified: boolean = false; - - private constructor() { - } - - private static api: string = "http://localhost:1337/api" - - private static apiUserEndpoint: string = StrapiUserRepo.api + "/auth/local" - - /** - * Verifies the current users jwt. - * @private - */ - private async verify() { - this.verified = false; - let result = await this.getMe(); - if (!result.error) { - this.verified = true; - } - } - - async getMe(): Promise { - const response = await StrapiUserRepo.fetchStrapi("/me", "GET", null, true, "/users") - return await response.json(); - } - - async registerUser(email: string, username: string, password: string): Promise { - const payload = { - email: email, - password: password, - username: username - }; - const response = await StrapiUserRepo.fetchStrapi("/register", "POST", payload, false); - return await response.json(); - } - - async loginUser(identifier: string, password: string): Promise { - const payload = { - identifier: identifier, - password: password - }; - const response = await StrapiUserRepo.fetchStrapi("/", "POST", payload, false); - return response.json(); - } - - private static async fetchStrapi(path: string, method: HttpMethod, body: any | null = null, authorization: boolean = true, customPath: any = null): Promise { - let requestInit: RequestInit = { - method: method, - }; - if (authorization && body) { - requestInit["headers"] = { - authorization: StrapiNoteRepository.getAuthorizationHeader() ?? '', - 'Accept': 'application/json', - 'Content-Type': 'application/json' - } - } else if (authorization) { - requestInit["headers"] = { - authorization: StrapiNoteRepository.getAuthorizationHeader() ?? '', - } - } else if (body) { - requestInit["headers"] = { - 'Accept': 'application/json', - 'Content-Type': 'application/json' - } - } - if (body) { - requestInit["body"] = JSON.stringify(body) - } - return await fetch((customPath) ? (this.api + customPath + path) : StrapiUserRepo.apiUserEndpoint + path, requestInit); - } -} \ No newline at end of file diff --git a/frontend/svelte/src/models/repos/user/UserRepository.ts b/frontend/svelte/src/models/repos/user/UserRepository.ts deleted file mode 100644 index 3128bfb..0000000 --- a/frontend/svelte/src/models/repos/user/UserRepository.ts +++ /dev/null @@ -1,19 +0,0 @@ -import type {Authentication} from "../../authentication"; - -export interface UserRepository { - /** - * Registers a new user. - * @param email - * @param username - * @param password - */ - registerUser(email: string, username: string, password: string): Promise; - - /** - * Gets the current user. - * @param jwt - */ - getMe(jwt: string): Promise; - - loginUser(identifier: string, password: string): Promise; -} \ No newline at end of file diff --git a/frontend/svelte/src/resources/icons/android-icon-144x144.png b/frontend/svelte/src/resources/icons/android-icon-144x144.png deleted file mode 100644 index d99f97b..0000000 Binary files a/frontend/svelte/src/resources/icons/android-icon-144x144.png and /dev/null differ diff --git a/frontend/svelte/src/resources/icons/android-icon-192x192.png b/frontend/svelte/src/resources/icons/android-icon-192x192.png deleted file mode 100644 index e44862e..0000000 Binary files a/frontend/svelte/src/resources/icons/android-icon-192x192.png and /dev/null differ diff --git a/frontend/svelte/src/resources/icons/android-icon-36x36.png b/frontend/svelte/src/resources/icons/android-icon-36x36.png deleted file mode 100644 index a51d24d..0000000 Binary files a/frontend/svelte/src/resources/icons/android-icon-36x36.png and /dev/null differ diff --git a/frontend/svelte/src/resources/icons/android-icon-48x48.png b/frontend/svelte/src/resources/icons/android-icon-48x48.png deleted file mode 100644 index 50cc44e..0000000 Binary files a/frontend/svelte/src/resources/icons/android-icon-48x48.png and /dev/null differ diff --git a/frontend/svelte/src/resources/icons/android-icon-72x72.png b/frontend/svelte/src/resources/icons/android-icon-72x72.png deleted file mode 100644 index 923f9b7..0000000 Binary files a/frontend/svelte/src/resources/icons/android-icon-72x72.png and /dev/null differ diff --git a/frontend/svelte/src/resources/icons/android-icon-96x96.png b/frontend/svelte/src/resources/icons/android-icon-96x96.png deleted file mode 100644 index 8251521..0000000 Binary files a/frontend/svelte/src/resources/icons/android-icon-96x96.png and /dev/null differ diff --git a/frontend/svelte/src/routes/+layout.js b/frontend/svelte/src/routes/+layout.js new file mode 100644 index 0000000..5829b7e --- /dev/null +++ b/frontend/svelte/src/routes/+layout.js @@ -0,0 +1 @@ +export const ssr = false; \ No newline at end of file diff --git a/frontend/svelte/src/routes/+page.svelte b/frontend/svelte/src/routes/+page.svelte index e744ac0..871b615 100644 --- a/frontend/svelte/src/routes/+page.svelte +++ b/frontend/svelte/src/routes/+page.svelte @@ -1,48 +1,118 @@ - + PomeloNote | Home - + -
- -
- -
- -
+
+ +
+
-
-
- {#if notes} - -
    - {#each notes as note} -
  • handleMouseOverLi(note.id)} - on:mouseout={() => handleMouseOutLi(note.id)}> -
    -
    onNoteLiClick(note)}> -
    - {note.title} -
    -
    - {note.lastViewed.toLocaleDateString()} -
    -
    - -
    - - - -
    -
    Do you really want to delete the "{note.title}" note?
    -
    -
    -
    - -
    -
    - -
    -
    -
    - - - -
    -
    -
    -
  • - {/each} -
- {/if} -
+
+ +
    + {#each notes as note} +
  • handleMouseOverLi(note.id)} + on:mouseout={() => handleMouseOutLi(note.id)}> +
    +
    onNoteLiClick(note)}> + + {note.title}
    + {note.lastOpened} +
    +
    +
    + +
    +
    +
  • + {/each} +
\ No newline at end of file diff --git a/frontend/svelte/src/routes/+page.ts b/frontend/svelte/src/routes/+page.ts deleted file mode 100644 index 3ebf8ca..0000000 --- a/frontend/svelte/src/routes/+page.ts +++ /dev/null @@ -1,6 +0,0 @@ -import {StrapiUserRepo} from "../models/repos/user/StrapiUserRepo"; - -/** @type {import('./$types').PageLoad} */ -export async function load() { - // StrapiUserRepo.getInstance(); -} \ No newline at end of file diff --git a/frontend/svelte/src/routes/editor/+page.svelte b/frontend/svelte/src/routes/editor/+page.svelte index b6d34a3..eeab65c 100644 --- a/frontend/svelte/src/routes/editor/+page.svelte +++ b/frontend/svelte/src/routes/editor/+page.svelte @@ -1,81 +1,24 @@ - Editor + {"Pomelonote | Edit " + currNote.title} -
-

{title === "" ? "‎" : title}

-
- -
- - -
+
+ {currNote.content}
- - diff --git a/frontend/svelte/src/routes/login/+page.svelte b/frontend/svelte/src/routes/login/+page.svelte index 537507d..27d2585 100644 --- a/frontend/svelte/src/routes/login/+page.svelte +++ b/frontend/svelte/src/routes/login/+page.svelte @@ -1,9 +1,9 @@ - - - - - - PomeloNote | Register - - - - -
- - Logo -

Register a new user

- -
- - -
- -
- - -
-
- - -
- - - Already registered? Login. -

©2022

- -
- - - - - \ No newline at end of file diff --git a/frontend/svelte/src/service-worker.js b/frontend/svelte/src/service-worker.js deleted file mode 100644 index 15b45e1..0000000 --- a/frontend/svelte/src/service-worker.js +++ /dev/null @@ -1,78 +0,0 @@ -/// - -import { build, files, version } from '$service-worker'; - -const worker = ServiceWorkerGlobalScope; -// const FILES = cache + version; - -const to_cache = build.concat(files); -const staticAssets = new Set(to_cache); - -worker.addEventListener('install', (event) => { - event.waitUntil( - caches - .open(FILES) - .then((cache) => cache.addAll(to_cache)) - .then(() => { - worker.skipWaiting(); - }) - ); -}); - -worker.addEventListener('activate', (event) => { - event.waitUntil( - caches.keys().then(async (keys) => { - // delete old caches - for (const key of keys) { - if (key !== FILES) await caches.delete(key); - } - - worker.clients.claim(); - }) - ); -}); - -/** - * Fetch the asset from the network and store it in the cache. - * Fall back to the cache if the user is offline. - */ -async function fetchAndCache(request) { - const cache = await caches.open(offline + version); - - try { - const response = await fetch(request); - cache.put(request, response.clone()); - return response; - } catch (err) { - const response = await cache.match(request); - if (response) return response; - - throw err; - } -} - -worker.addEventListener('fetch', (event) => { - if (event.request.method !== 'GET' || event.request.headers.has('range')) return; - - const url = new URL(event.request.url); - - // don't try to handle e.g. data: URIs - const isHttp = url.protocol.startsWith('http'); - const isDevServerRequest = - url.hostname === self.location.hostname && url.port !== self.location.port; - const isStaticAsset = url.host === self.location.host && staticAssets.has(url.pathname); - const skipBecauseUncached = event.request.cache === 'only-if-cached' && !isStaticAsset; - - if (isHttp && !isDevServerRequest && !skipBecauseUncached) { - event.respondWith( - (async () => { - // always serve static files and bundler-generated assets from cache. - // if your application has other URLs with data that will never change, - // set this variable to true for them and they will only be fetched once. - const cachedAsset = isStaticAsset && (await caches.match(event.request)); - - return cachedAsset || fetchAndCache(event.request); - })() - ); - } -}); \ No newline at end of file diff --git a/frontend/svelte/src/stores.ts b/frontend/svelte/src/stores.ts deleted file mode 100644 index b763f5f..0000000 --- a/frontend/svelte/src/stores.ts +++ /dev/null @@ -1,7 +0,0 @@ -import {writable} from "svelte/store"; -import {browser} from "$app/environment" -export const currentNoteId = writable(); -if (browser) { - currentNoteId.set(Number(localStorage.getItem("currentNoteId") || "")) - currentNoteId.subscribe(val => localStorage.setItem("currentNoteId", String(val))); -} \ No newline at end of file diff --git a/frontend/svelte/src/models/types.ts b/frontend/svelte/src/types.ts similarity index 77% rename from frontend/svelte/src/models/types.ts rename to frontend/svelte/src/types.ts index 0b0e8aa..9814953 100644 --- a/frontend/svelte/src/models/types.ts +++ b/frontend/svelte/src/types.ts @@ -2,5 +2,5 @@ export interface Note { id: number; title: string; content: string; - lastViewed: Date; + lastOpened: string; } \ No newline at end of file diff --git a/frontend/svelte/src/userInput.css b/frontend/svelte/src/userInput.css deleted file mode 100644 index 877e674..0000000 --- a/frontend/svelte/src/userInput.css +++ /dev/null @@ -1,41 +0,0 @@ -html, -body { - height: 100%; -} - -body { - align-items: center; - padding-top: 40px; - padding-bottom: 40px; - background-color: #f5f5f5; -} - -.form-signin { - max-width: 330px; - padding: 15px; -} - -.form-signin .form-floating:focus-within { - z-index: 2; -} - -.form-signin input[type="text"] { - margin-bottom: -1px; - border-bottom-right-radius: 0; - border-bottom-left-radius: 0; -} - -.form-signin input[type="email"] { - margin-bottom: -1px; - border-radius: 0; -} - -.form-signin input[type="password"] { - margin-bottom: 10px; - border-top-left-radius: 0; - border-top-right-radius: 0; -} - -.img-fluid { - margin-bottom: 15px; -} \ No newline at end of file diff --git a/frontend/svelte/static/manifest.json b/frontend/svelte/static/manifest.json deleted file mode 100644 index 654b436..0000000 --- a/frontend/svelte/static/manifest.json +++ /dev/null @@ -1,41 +0,0 @@ -{ - "lang": "en", - "dir": "/", - "name": "Pomelo Note", - "short_name": "Pomelo", - "description": "Best Note App", - "theme_color": "#000", - "background_color": "#000", - "display": "standalone", - "orientation": "portrait", - "prefer_related_applications": false, - "scope": "/", - "start_url": "/", - "icons": [ - { - "src": "../resources/icons/android-icon-36x36.png", - "sizes": "36x36", - "type": "image\/png", - "density": "0.75" - }, - { - "src": "../resources/icons/android-icon-48x48.png", - "sizes": "48x48", - "type": "image\/png", - "density": "1.0" - }, - { - "src": "../resources/icons/android-icon-72x72.png", - "sizes": "72x72", - "type": "image\/png", - "density": "1.5" - }, - { - "src": "../resources/icons/android-icon-96x96.png", - "sizes": "96x96", - "type": "image\/png", - "density": "2.0" - } - ], - "splash_pages": null -} \ No newline at end of file diff --git a/frontend/svelte/vite.config.ts b/frontend/svelte/vite.config.ts index d538b6b..1695034 100644 --- a/frontend/svelte/vite.config.ts +++ b/frontend/svelte/vite.config.ts @@ -2,14 +2,7 @@ import { sveltekit } from '@sveltejs/kit/vite'; import type { UserConfig } from 'vite'; const config: UserConfig = { - plugins: [sveltekit()], - - server: { - fs: { - // Allow serving files from one level up to the project root - allow: ['..'], - }, - }, + plugins: [sveltekit()] }; export default config;