import { Api } from "make-api"; import { Schema as S } from "@effect/schema"; import { PieceId, UserId } from "common"; import { pipe } from "effect"; import { Piece } from "./db"; // --- PIECES ------------------------------------------------------------------ export const CreatePiece = pipe( Api.make("POST", "piece"), Api.requestBodyJson(S.Struct({ name: S.NonEmptyString, composer: S.Union(S.NonEmptyString, S.Null), lyricist: S.Union(S.NonEmptyString, S.Null), arranger: S.Union(S.NonEmptyString, S.Null), })), Api.responseBodyJson(201, Piece), Api.responseBodyText(400, S.String), ); export const GetPieces = pipe( Api.make("GET", "piece"), Api.responseBodyJson(200, S.Array(Piece)), ); export const UpdatePiece = pipe( Api.make("PUT", "piece", ["pieceId", PieceId]), Api.requestBodyJson(S.Struct({ name: S.NonEmptyString, composer: S.Union(S.NonEmptyString, S.Null), lyricist: S.Union(S.NonEmptyString, S.Null), arranger: S.Union(S.NonEmptyString, S.Null), })), Api.responseBodyJson(200, Piece), Api.responseBodyText(400, S.String), ); export const DeletePiece = pipe( Api.make("DELETE", "piece", ["pieceId", PieceId]), Api.responseBodyNone(200), Api.responseBodyText(400, S.String), Api.responseBodyText(404, S.String), ); // --- AUTHENTICATION ---------------------------------------------------------- export const Me = pipe( Api.make("GET", "me"), Api.responseBodyJson(200, S.Struct({ userId: UserId, username: S.NonEmptyString, admin: S.Boolean, })), Api.responseBodyText(401, S.String), ); export const Logout = pipe( Api.make("POST", "logout"), Api.responseBodyNone(204), ); export const Login = pipe( Api.make("POST", "login"), Api.requestBodyJson(S.Struct({ username: S.NonEmptyString, password: S.NonEmptyString, })), Api.responseBodyJson(200, S.Struct({ userId: UserId, username: S.NonEmptyString, admin: S.Boolean, })), Api.responseBodyText(400, S.String), Api.responseBodyText(401, S.String), );