From fbe0e35587ddb4c4310dbe6c66bceeac0f96e18d Mon Sep 17 00:00:00 2001 From: Jesse Wierzbinski Date: Tue, 28 May 2024 14:36:15 -1000 Subject: [PATCH] refactor(federation): :recycle: Refactor inbox code to use new package builtins --- bun.lockb | Bin 283620 -> 283228 bytes packages/lysand-api | 2 +- server/api/users/:uuid/inbox/index.ts | 93 +++++++------------------- 3 files changed, 24 insertions(+), 71 deletions(-) diff --git a/bun.lockb b/bun.lockb index df228f7d8a37c1319d5373eea9586bc471c08b73..c8b36af434eb56f2ac821b7a158f8d36bf43cd09 100755 GIT binary patch delta 1995 zcmbuAZBSHY6vvzwo zkPUTItkr6JhmN|fu0O5|5iLYZ>68!&xE?$3%Ap3-WZV#91;s9R9o-XyI2N%C-mz9# zgWIyFdzU?lSont=h4O^I_xcv|H+V)qSghYQQE1M^9VLjY{`!JKS?8~r+G73?tQ1Tm zW}ZRxbSN4sE;KuC3gJei`(3$(@?fy$#$VRr`vQw#f)A%ER%^b@S>_-X;$96!OM)Kex>jb%VAH(DHZV%3z^UJ4 zr?@T^n)*%lMu_=@NJH=p0_y9VT=)=l5*NP3Y%Q1x8gI3Dn^`*a1f1+Nvkd6v=mK@) z9WYw$I`|oC5$q$b%Y;^{egK=$$*HrP%0g<1HW7A?*~8GkF#DL=Q;=Cd1iym zHXyb`lLeSLq5laHd`UwLo8TgV8PH&~yEK_Rcn&l@B#0{wjL)Ok08P0Ot}B3cF*BGw zMzzpXKgukTW(xb80L*u3T+l?`Z^?|cKj~;~qrP62 zsvjHm52RGSCOt{UsP~%m9Wq1RZqg4$ZEFf2KU=e|?s`qhs-aoW3Y}cl*{t8PR5pk6 zi#v_hBYN4C5xLXUrdgc3!l%1(mpbD$WvZvjO__0nueH1SlUGl4bF$rQ{OmP3r1`Qp rT)n8?^_tdGalXaP|J~}{3PmZZtK76Ns+%Ex$|_}C%Tl&IrVIZ9i#kQ) delta 2129 zcmb`JYfx2H6vy}8=cwF^V2D=%@d0G<61|FmilUMZ0?Oqvp^Z8*O`;Yy%9V#!knbKd z<=mQ0I@3s6cu_&T#sQlgXZm0tYQ{2Ao2JyUvVjZIOeG20f8D$M-iOw(X8+f3uXFa< zYwdF`KOT>`(-QGsT2fcF{42L&O0L^~@KNbTe`kDQ#kT(3k@6po{M-~(+2}7TH3iw( zL*>)dme!8CEXVw7D}}HL(Rlx=5aAg2^$0NmV|~T;%4+1UyC%d~ik(?o>DmIs5s0&W zw;bh;kX?P1-y9s@8}G|Xx#JzR5EIf9_iCnXDQ@!&BH?LH%aq-owO4a&He5OvEW#6a zA=9=A(NaVXPeppB^m?Lua%?xi^1&1_Tf%iARs^Ev#hJFvh_VnFp17Hrve_4X?SW&t z!V}FOEyNg%OE8lCm(f68F6Za^iv0!u)2*x{`Y@&3?GkmOuT(J?(m-ckEIY& zJRJ8BV~ZZ@mF4jwzw2l#@(X>IEV=psoYEdeEyP8)A8C6Hkpo zynxweFuI)Dg98Vv&mq0cyoKfXqtLRJs{g3$ZHT{3Ib{Z*?|BQVk&eQG(IEZ zAhT)E(VX`tv*}p;K6xbl0N7yIKo`(K|*{94B!G6WQY5y(ElAwR%TAW~(40bn|*C4zMQvjzx(_ZPF zp=(m%yWwOfnaza$J3xdu1xC-12Jd6m&Uv#C_cJ@gY&PN~XtIs~Llc|`9tBXaleF+0 ziXmt*A76}*u}Foco1DW)3#Y?pLDQVYdGny1%(|FmfX#)b{BCB6^rUn=pE$4du3~eB z72Bplq?$Ea$G59w%hj%2DtsO?GT`a(SZTF&s11h9vcf)7UrGmk%oo5H!n5Iv;W_%3 zPIXBojJ8@WRU$)|oX0Y-!Yjd5Y;FX!`7@TYTlu1%qfSu=E5O&l2jIhS>K46*FQ5+8 zBzoL7_-Qy5o(?EAg_=d0z8EpcZM*^iTU}#ie5dXm)k~_4n5f6UoR5D36XgbHnlmj+ zuc}*Bi9YNypS54)_+B8Z#-7Ok7?hRjoyF$ue*xl2b;$q# diff --git a/packages/lysand-api b/packages/lysand-api index 16eae048..3ed54a7c 160000 --- a/packages/lysand-api +++ b/packages/lysand-api @@ -1 +1 @@ -Subproject commit 16eae048c886de41f3bb9048fe3aeff113a442ef +Subproject commit 3ed54a7c21e69b79b410bac687f30f47d75e5397 diff --git a/server/api/users/:uuid/inbox/index.ts b/server/api/users/:uuid/inbox/index.ts index b7929110..a89ee79a 100644 --- a/server/api/users/:uuid/inbox/index.ts +++ b/server/api/users/:uuid/inbox/index.ts @@ -1,18 +1,13 @@ import { applyConfig, debugRequest, handleZodError } from "@api"; import { zValidator } from "@hono/zod-validator"; import { dualLogger } from "@loggers"; -import { - EntityValidator, - type HttpVerb, - SignatureValidator, -} from "@lysand-org/federation"; import { errorResponse, jsonResponse, response } from "@response"; import type { SocketAddress } from "bun"; import { eq } from "drizzle-orm"; import type { Hono } from "hono"; import { matches } from "ip-matching"; import { z } from "zod"; -import { isValidationError } from "zod-validation-error"; +import { type ValidationError, isValidationError } from "zod-validation-error"; import { resolveNote } from "~database/entities/Status"; import { getRelationshipToOtherUser, @@ -23,6 +18,11 @@ import { Notifications, Relationships } from "~drizzle/schema"; import { config } from "~packages/config-manager"; import { User } from "~packages/database-interface/user"; import { LogLevel, LogManager } from "~packages/log-manager"; +import { + EntityValidator, + RequestParserHandler, + SignatureValidator, +} from "~packages/lysand-api/federation"; export const meta = applyConfig({ allowedMethods: ["POST"], @@ -192,13 +192,11 @@ export default (app: Hono) => } const validator = new EntityValidator(); + const handler = new RequestParserHandler(body, validator); try { - // Add sent data to database - switch (body.type) { - case "Note": { - const note = await validator.Note(body); - + const result = await handler.parseBody({ + note: async (note) => { const account = await User.resolve(note.author); if (!account) { @@ -222,21 +220,8 @@ export default (app: Hono) => } return response("Note created", 201); - } - case "Follow": { - const follow = await validator.Follow(body); - - if ( - config.federation.discard.follows.find( - (blocked) => - blocked.includes(origin) || - origin.includes(blocked), - ) - ) { - // Pretend to accept request - return response("Follow request sent", 200); - } - + }, + follow: async (follow) => { const account = await User.resolve(follow.author); if (!account) { @@ -246,7 +231,6 @@ export default (app: Hono) => const foundRelationship = await getRelationshipToOtherUser(account, user); - // Check if already following if (foundRelationship.following) { return response("Already following", 200); } @@ -271,39 +255,21 @@ export default (app: Hono) => }); if (!user.getUser().isLocked) { - // Federate FollowAccept await sendFollowAccept(account, user); } return response("Follow request sent", 200); - } - case "FollowAccept": { - const followAccept = await validator.FollowAccept(body); - - if ( - config.federation.discard.follows.find( - (blocked) => - blocked.includes(origin) || - origin.includes(blocked), - ) - ) { - // Pretend to accept request - return response("Follow request accepted", 200); - } - + }, + followAccept: async (followAccept) => { const account = await User.resolve(followAccept.author); if (!account) { return errorResponse("Author not found", 400); } - console.log(account); - const foundRelationship = await getRelationshipToOtherUser(user, account); - console.log(foundRelationship); - if (!foundRelationship.requested) { return response( "There is no follow request to accept", @@ -320,21 +286,8 @@ export default (app: Hono) => .where(eq(Relationships.id, foundRelationship.id)); return response("Follow request accepted", 200); - } - case "FollowReject": { - const followReject = await validator.FollowReject(body); - - if ( - config.federation.discard.follows.find( - (blocked) => - blocked.includes(origin) || - origin.includes(blocked), - ) - ) { - // Pretend to accept request - return response("Follow request rejected", 200); - } - + }, + followReject: async (followReject) => { const account = await User.resolve(followReject.author); if (!account) { @@ -360,17 +313,17 @@ export default (app: Hono) => .where(eq(Relationships.id, foundRelationship.id)); return response("Follow request rejected", 200); - } - default: { - return errorResponse( - "Object has not been implemented", - 400, - ); - } + }, + }); + + if (result) { + return result; } + + return errorResponse("Object has not been implemented", 400); } catch (e) { if (isValidationError(e)) { - return errorResponse(e.message, 400); + return errorResponse((e as ValidationError).message, 400); } dualLogger.logError(LogLevel.ERROR, "Inbox", e as Error); return jsonResponse(