Add new follow API endpoint

This commit is contained in:
Jesse Wierzbinski 2023-09-21 17:18:05 -10:00
parent 36b682d662
commit a9688b8178
7 changed files with 275 additions and 30 deletions

View file

@ -115,7 +115,7 @@ export default async (
return actor;
}
user.following.push(actor);
// TODO: Add follower
await user.save();
}
@ -142,9 +142,7 @@ export default async (
return actor;
}
user.following = user.following.filter(
following => following.id !== actor.id
);
// TODO: Remove follower
await user.save();
}
@ -168,7 +166,7 @@ export default async (
return actor;
}
user.followers.push(actor);
// TODO: Add follower
await user.save();
break;

View file

@ -0,0 +1,66 @@
import { getUserByToken } from "@auth";
import { parseRequest } from "@request";
import { errorResponse, jsonResponse } from "@response";
import { MatchedRoute } from "bun";
import { Relationship } from "~database/entities/Relationship";
import { User } from "~database/entities/User";
/**
* Follow a user
*/
export default async (
req: Request,
matchedRoute: MatchedRoute
): Promise<Response> => {
const id = matchedRoute.params.id;
// Check auth token
const token = req.headers.get("Authorization")?.split(" ")[1] || null;
if (!token)
return errorResponse("This method requires an authenticated user", 422);
const self = await getUserByToken(token);
if (!self) return errorResponse("Unauthorized", 401);
const { languages, notify, reblogs } = await parseRequest<{
reblogs?: boolean;
notify?: boolean;
languages?: string[];
}>(req);
const user = await User.findOneBy({
id,
});
if (!user) return errorResponse("User not found", 404);
// Check if already following
let relationship = await self.getRelationshipToOtherUser(user);
if (!relationship) {
// Create new relationship
const newRelationship = await Relationship.createNew(self, user);
self.relationships.push(newRelationship);
await self.save();
relationship = newRelationship;
}
if (!relationship.following) {
relationship.following = true;
}
if (reblogs) {
relationship.showing_reblogs = true;
}
if (notify) {
relationship.notifying = true;
}
if (languages) {
relationship.languages = languages;
}
return jsonResponse(await relationship.toAPI());
};