/** * Serves what the caller follows, and follows or stops following for them. * The dumps of what they follow, the index's "follow" tab, are * `GET /api/dumps?follow=`'s (`routes/dumps.ts`), and what another user * follows is `routes/users.ts`'s. * * - `GET /api/me/follow` — signed in. Answers the ids of the users and * playlists they follow. * - `PUT /api/me/follow/users/:userId` — signed in. Follows a user. * - `DELETE /api/me/follow/users/:userId` — signed in. Stops following a user. * - `PUT /api/me/follow/playlists/:playlistId` — signed in. Follows a public * playlist. * - `DELETE /api/me/follow/playlists/:playlistId` — signed in. Stops following * a playlist. * * @module */ import { Router } from "@oak/oak"; import { authMiddleware } from "../middleware/auth.ts"; import type { APIResponse } from "../../shared/api.ts"; import type { FollowStatus } from "../../shared/follow.ts"; import { followPlaylist, followUser, getFollowStatus, unfollowPlaylist, unfollowUser, } from "../services/follow-service.ts"; /** * Mounted by `api/main.ts` behind the error, Open Graph and CORS middleware. * An `APIException` thrown by a handler becomes the JSON error response there. */ const router: Router = new Router({ prefix: "/api/me" }); router.get("/follow", authMiddleware, (ctx) => { const status = getFollowStatus(ctx.state.user.userId); const body: APIResponse = { success: true, data: status }; ctx.response.body = body; }); router.put("/follow/users/:userId", authMiddleware, (ctx) => { followUser(ctx.state.user.userId, ctx.params.userId); ctx.response.status = 204; }); router.delete("/follow/users/:userId", authMiddleware, (ctx) => { unfollowUser(ctx.state.user.userId, ctx.params.userId); ctx.response.status = 204; }); router.put("/follow/playlists/:playlistId", authMiddleware, (ctx) => { followPlaylist(ctx.state.user.userId, ctx.params.playlistId); ctx.response.status = 204; }); router.delete("/follow/playlists/:playlistId", authMiddleware, (ctx) => { unfollowPlaylist(ctx.state.user.userId, ctx.params.playlistId); ctx.response.status = 204; }); export default router;