diff --git a/packages/backend/src/database.ts b/packages/backend/src/database.ts index eca10ec..9d5ff02 100644 --- a/packages/backend/src/database.ts +++ b/packages/backend/src/database.ts @@ -1,7 +1,7 @@ -import { AttachmentId, PieceId, RequestId, SessionId, Sha256, UserId } from "common"; -import { ColumnType, CompiledQuery, CreateTableBuilder, Insertable, Kysely, Selectable, sql, Updateable } from "kysely"; -import { BunSqliteDialect } from "kysely-bun-sqlite"; import { Database as BunSqliteDatabase } from "bun:sqlite"; +import { AttachmentId, PieceId, RequestId, SessionId, Sha256, UserId } from "common"; +import { ColumnType, CompiledQuery, CreateTableBuilder, Kysely } from "kysely"; +import { BunSqliteDialect } from "kysely-bun-sqlite"; export function generateSessionId(byteLength: number = 32): SessionId { const array = new Uint8Array(byteLength); @@ -112,6 +112,13 @@ export async function initDatabase(filename: string = "db.sqlite3"): Promise c.notNull().primaryKey()) + .addColumn("data", "blob", (c) => c.notNull()) + .execute(); + await db.schema .createTable("User") .ifNotExists() @@ -152,11 +159,28 @@ export async function initDatabase(filename: string = "db.sqlite3"): Promise c.notNull().primaryKey()) .addColumn("pieceId", "text", (c) => c.notNull().references("Piece.pieceId").onDelete("cascade").onUpdate("cascade")) - .addColumn("sha256", "blob", (c) => c.notNull()) + .addColumn("sha256", "blob", (c) => c.notNull().references("File.sha256").onDelete("restrict").onUpdate("restrict")) .addColumn("filename", "text", (c) => c.notNull()) .addColumn("mediaType", "text", (c) => c.notNull()) .$call(systemInformation) .execute(); + const { count } = await db + .selectFrom("User") + .select((eb) => eb.fn.countAll().as("count")) + .executeTakeFirstOrThrow(); + + if (BigInt(count) === 0n) { + const userId = UserId(Bun.randomUUIDv7()); + const username = "admin"; + const password = await Bun.password.hash("admin"); + const admin = 1; + + await db + .insertInto("User") + .values({ userId, username, password, admin }) + .execute(); + } + return db; } diff --git a/packages/frontend/src/app.tsx b/packages/frontend/src/app.tsx index de4aca1..9ca12b6 100644 --- a/packages/frontend/src/app.tsx +++ b/packages/frontend/src/app.tsx @@ -1,9 +1,9 @@ +import { StrictMode } from "react"; +import { createRoot } from "react-dom/client"; +import { createBrowserRouter, RouterProvider } from "react-router-dom"; import { Home } from "./routes/Home"; import { Login } from "./routes/Login"; -import { createRoot } from "react-dom/client"; -import { StrictMode } from "react"; import "./style.css"; -import { createBrowserRouter, RouterProvider } from "react-router-dom"; const router = createBrowserRouter([ { diff --git a/packages/frontend/src/client.ts b/packages/frontend/src/client.ts index 1c72668..446cb16 100644 --- a/packages/frontend/src/client.ts +++ b/packages/frontend/src/client.ts @@ -1,4 +1,4 @@ import { treaty } from "@elysiajs/eden"; import type { App } from "backend/app"; -export const client = treaty("localhost:3000"); +export const client = treaty("localhost:3000", { fetch: { credentials: "include" } }); diff --git a/packages/frontend/src/routes/Home.css.ts b/packages/frontend/src/routes/Home.css.ts deleted file mode 100644 index de8e054..0000000 --- a/packages/frontend/src/routes/Home.css.ts +++ /dev/null @@ -1,59 +0,0 @@ -export const logout = { - padding: 8, - - backgroundColor: "#C0C0C0", - - borderWidth: 2, - borderStyle: "solid", - borderTopColor: "#E0E0E0", - borderLeftColor: "#E0E0E0", - borderRightColor: "#404040", - borderBottomColor: "#404040", - - borderRadius: 4, - - cursor: "pointer", - - "selectors": { - "&:focus": { - outlineWidth: 2, - outlineStyle: "solid", - outlineColor: "#8080FF", - - "@media": { - "(prefers-color-scheme: dark)": { - outlineColor: "#C0C0FF", - }, - }, - }, - - "&:active": { - borderTopColor: "#404040", - borderLeftColor: "#404040", - borderRightColor: "#E0E0E0", - borderBottomColor: "#E0E0E0", - - "@media": { - "(prefers-color-scheme: dark)": { - outlineColor: "#C0C0FF", - - borderTopColor: "#202020", - borderLeftColor: "#202020", - borderRightColor: "#606060", - borderBottomColor: "#606060", - }, - }, - }, - }, - - "@media": { - "(prefers-color-scheme: dark)": { - backgroundColor: "#404040", - - borderTopColor: "#606060", - borderLeftColor: "#606060", - borderRightColor: "#202020", - borderBottomColor: "#202020", - }, - }, -}; diff --git a/packages/frontend/src/routes/Home.tsx b/packages/frontend/src/routes/Home.tsx index 9c2e6c7..00eabe3 100644 --- a/packages/frontend/src/routes/Home.tsx +++ b/packages/frontend/src/routes/Home.tsx @@ -2,8 +2,9 @@ import { useEffect } from "react"; import { useNavigate } from "react-router-dom"; import { client } from "../client"; import { useStore } from "../store"; +import { Button } from "../styled/Button"; -export const Home = () => { +export function Home() { const navigate = useNavigate(); @@ -28,7 +29,7 @@ export const Home = () => { }, []); const onLogoutClick = async () => { - const { data, error } = await client.logout.post(); + const { error } = await client.logout.post(); if (error !== null) { console.error("Response was not ok"); @@ -53,15 +54,11 @@ export const Home = () => { Użytkownik: {user.username}
- +
); -}; +} diff --git a/packages/frontend/src/routes/Login.css.ts b/packages/frontend/src/routes/Login.css.ts deleted file mode 100644 index b3317b3..0000000 --- a/packages/frontend/src/routes/Login.css.ts +++ /dev/null @@ -1,59 +0,0 @@ -export const submit = { - padding: 8, - - backgroundColor: "#C0C0C0", - - borderWidth: 2, - borderStyle: "solid", - borderTopColor: "#E0E0E0", - borderLeftColor: "#E0E0E0", - borderRightColor: "#404040", - borderBottomColor: "#404040", - - borderRadius: 4, - - cursor: "pointer", - - "selectors": { - "&:focus": { - outlineWidth: 2, - outlineStyle: "solid", - outlineColor: "#8080FF", - - "@media": { - "(prefers-color-scheme: dark)": { - outlineColor: "#C0C0FF", - }, - }, - }, - - "&:active": { - borderTopColor: "#404040", - borderLeftColor: "#404040", - borderRightColor: "#E0E0E0", - borderBottomColor: "#E0E0E0", - - "@media": { - "(prefers-color-scheme: dark)": { - outlineColor: "#C0C0FF", - - borderTopColor: "#202020", - borderLeftColor: "#202020", - borderRightColor: "#606060", - borderBottomColor: "#606060", - }, - }, - }, - }, - - "@media": { - "(prefers-color-scheme: dark)": { - backgroundColor: "#404040", - - borderTopColor: "#606060", - borderLeftColor: "#606060", - borderRightColor: "#202020", - borderBottomColor: "#202020", - }, - }, -}); diff --git a/packages/frontend/src/routes/Login.tsx b/packages/frontend/src/routes/Login.tsx index 7614bda..616fd3d 100644 --- a/packages/frontend/src/routes/Login.tsx +++ b/packages/frontend/src/routes/Login.tsx @@ -2,8 +2,10 @@ import { FormEventHandler, useId } from "react"; import { useNavigate } from "react-router-dom"; import { client } from "../client"; import { useStore } from "../store"; +import { Button } from "../styled/Button"; +import { Input } from "../styled/Input"; -export const Login = () => { +export function Login() { const navigate = useNavigate(); @@ -43,9 +45,8 @@ export const Login = () => {
Repozytorium muzyczne
- { onInput={(e) => setLoginUsername(e.currentTarget.value)} /> - setLoginPassword(e.currentTarget.value)} /> - +
); -}; +} diff --git a/packages/frontend/src/styled/Button.tsx b/packages/frontend/src/styled/Button.tsx new file mode 100644 index 0000000..e9afd38 --- /dev/null +++ b/packages/frontend/src/styled/Button.tsx @@ -0,0 +1,41 @@ +import { ButtonHTMLAttributes, DetailedHTMLProps } from "react"; + +export namespace Button { + export type Props = Omit, HTMLButtonElement>, "className">; +} + +export function Button({ children, ...props }: Button.Props) { + return ( + + ); +} diff --git a/packages/frontend/src/styled/Input.tsx b/packages/frontend/src/styled/Input.tsx new file mode 100644 index 0000000..ae2ab73 --- /dev/null +++ b/packages/frontend/src/styled/Input.tsx @@ -0,0 +1,27 @@ +import { DetailedHTMLProps, InputHTMLAttributes } from "react"; + +export namespace Input { + export type Props = Omit, HTMLInputElement>, "className">; +} + +export function Input({ children, ...props }: Input.Props) { + return ( + + {children} + + ); +} diff --git a/tsconfig.json b/tsconfig.json index 97e426b..d02120e 100644 --- a/tsconfig.json +++ b/tsconfig.json @@ -5,6 +5,5 @@ { "path": "packages/backend" }, { "path": "packages/common" }, { "path": "packages/frontend" }, - { "path": "packages/make-api" }, ], }