A feed's tab, as a profile's, a search's or the community page's, now takes the place of the current history entry, since it is a view of the same page; picking a category, another page, still adds one. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
64 lines
2.1 KiB
TypeScript
64 lines
2.1 KiB
TypeScript
/**
|
|
* 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<FollowStatus> = { 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;
|