feat: add RemoveBrokers tRPC router, service layer, broker registry, and removal engine

- Create Valibot schemas for removal request CRUD, scan, and listing filters
- Implement broker registry with 48 major data brokers and removal metadata
- Build removal engine with automated, form, email, and status tracking support
- Add service layer with subscription-scoped operations: create/get/scan/stats/process
- Wire removebrokers router into root app router
- Write 20 passing unit tests (router + service layer)
This commit is contained in:
2026-05-25 16:47:31 -04:00
parent a3fee924d8
commit d84595bf72
8 changed files with 1584 additions and 0 deletions

View File

@@ -0,0 +1,50 @@
import { wrap } from "@typeschema/valibot";
import { createTRPCRouter, protectedProcedure } from "../utils";
import {
CreateRemovalRequestSchema,
RequestStatusSchema,
ScanListingsSchema,
BrokerListingsFilterSchema,
RemovalRequestsFilterSchema,
} from "../schemas/removebrokers";
import * as removebrokersService from "~/server/services/removebrokers.service";
export const removebrokersRouter = createTRPCRouter({
getBrokerRegistry: protectedProcedure.query(async () => {
return removebrokersService.getBrokerRegistry();
}),
getRemovalRequests: protectedProcedure
.input(wrap(RemovalRequestsFilterSchema))
.query(async ({ ctx, input }) => {
return removebrokersService.getRemovalRequests(ctx.user.id, input);
}),
createRemovalRequest: protectedProcedure
.input(wrap(CreateRemovalRequestSchema))
.mutation(async ({ ctx, input }) => {
return removebrokersService.createRemovalRequest(ctx.user.id, input.brokerId, input.personalInfo);
}),
getRequestStatus: protectedProcedure
.input(wrap(RequestStatusSchema))
.query(async ({ ctx, input }) => {
return removebrokersService.getRequestStatus(ctx.user.id, input.requestId);
}),
getBrokerListings: protectedProcedure
.input(wrap(BrokerListingsFilterSchema))
.query(async ({ ctx, input }) => {
return removebrokersService.getBrokerListings(ctx.user.id, input);
}),
scanForListings: protectedProcedure
.input(wrap(ScanListingsSchema))
.mutation(async ({ ctx, input }) => {
return removebrokersService.scanForListings(ctx.user.id, input.brokerId);
}),
getStats: protectedProcedure.query(async ({ ctx }) => {
return removebrokersService.getStats(ctx.user.id);
}),
});