This repository has been archived on 2025-03-02. You can view files and clone it, but cannot push or open issues or pull requests.
identity/identity-api/src/routes/entry/index.ts
2024-06-30 18:13:29 +02:00

152 lines
5.5 KiB
TypeScript

// Identity. Store your memories and mental belongings
// Copyright (C) 2024 Sofía Aritz
//
// This program is free software: you can redistribute it and/or modify
// it under the terms of the GNU Affero General Public License as published
// by the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU Affero General Public License for more details.
//
// You should have received a copy of the GNU Affero General Public License
// along with this program. If not, see <https://www.gnu.org/licenses/>.
import { randomUUID } from "node:crypto";
import list from "./list.js";
import type { AppInterface } from "../../app.js";
import type { AuthInterface } from "../../auth.js";
import { toDBList, type DatabaseInterface } from "../../database.js";
import { Static, Type } from "@sinclair/typebox";
const EntryIDQuery = Type.Object({
entry_id: Type.String(),
});
type EntryIDQueryType = Static<typeof EntryIDQuery>;
const PutEntryBody = Type.Object({
entry: Type.Object({
title: Type.Optional(Type.String()),
description: Type.Optional(Type.String()),
creationDate: Type.String(),
assets: Type.Array(Type.String()),
feelings: Type.Array(
Type.Union([
Type.String(),
Type.Object({
identifier: Type.String(),
description: Type.String(),
backgroundColor: Type.String(),
textColor: Type.String(),
}),
]),
),
base: Type.Union([
Type.Object({
kind: Type.String(),
}),
Type.Object({
kind: Type.String(),
artist: Type.String(),
title: Type.String(),
link: Type.Array(Type.String()),
id: Type.Array(
Type.Object({
provider: Type.String(),
id: Type.String(),
}),
),
}),
Type.Object({
kind: Type.String(),
location: Type.Union([
Type.String(),
Type.Object({
latitude: Type.Number(),
longitude: Type.Number(),
}),
]),
}),
Type.Object({
kind: Type.String(),
referencedDate: Type.String(),
}),
]),
}),
});
type PutEntryBodyType = Static<typeof PutEntryBody>;
export default function registerRoutes(app: AppInterface, auth: AuthInterface, database: DatabaseInterface) {
list(app, auth, database);
app.delete<{ Querystring: EntryIDQueryType }>("/entry", {
async handler(request) {
let jwt = request.headers["authorization"].replace("Bearer", "").trim();
let { payload } = await auth.verifyJwt(jwt);
let user = await auth.user(payload.uid);
database.removeEntry(request.query.entry_id);
},
schema: {
headers: { $ref: "schema://identity/authorization" },
querystring: EntryIDQuery,
},
});
app.put<{ Body: PutEntryBodyType }>("/entry", {
async handler(request) {
let jwt = request.headers["authorization"].replace("Bearer", "").trim();
let { payload } = await auth.verifyJwt(jwt);
let entry = request.body.entry;
let musicEntry, locationEntry, dateEntry;
if ((entry.base.kind === "album" || entry.base.kind === "song") && "artist" in entry.base) {
musicEntry = {
id: randomUUID(),
title: entry.base.title,
artist: entry.base.artist,
links: toDBList(entry.base.link),
universalIDs: toDBList(entry.base.id),
};
} else if (entry.base.kind === "environment" && "location" in entry.base) {
locationEntry = {
id: randomUUID(),
locationText: typeof entry.base.location === "string" ? entry.base.location : undefined,
locationCoordinates:
typeof entry.base.location === "string" ? undefined : JSON.stringify(entry.base.location),
};
} else if (entry.base.kind === "date" && "referencedDate" in entry.base) {
dateEntry = {
id: randomUUID(),
referencedDate: Date.parse(entry.base.referencedDate),
};
}
await database.insertEntry(
{
id: randomUUID(),
userID: payload.uid,
feelings: toDBList(entry.feelings),
assets: toDBList(entry.assets),
title: entry.title,
description: entry.description,
kind: entry.base.kind,
createdAt: Date.now(),
},
musicEntry,
locationEntry,
dateEntry,
);
},
schema: {
headers: { $ref: "schema://identity/authorization" },
body: PutEntryBody,
},
});
}