1import { Inject, Body, Controller, Delete, Get, Param, Patch, Post, Put, Query, Req } from "@nestjs/common";
2import type { Request } from "express";
3import { UsersService } from "./users.service.js";
4import { ZodValidate } from "../../common/pipes/zod-validation.pipe.js";
5import { requireUser } from "../../common/types.js";
6import {
7 UpdateProfileDto, type UpdateProfileInput, ListUsersQuery, type ListUsersInput,
8 RecordRecentItemDto, type RecordRecentItemInput,
9 SavedSearchCreateDto, type SavedSearchCreateInput,
10 SavedSearchUpdateDto, type SavedSearchUpdateInput
11} from "./dto.js";
12
13@Controller("users")
14export class UsersController {
15 constructor(@Inject(UsersService) private readonly users: UsersService) {}
16
17 @Get("me")
18 me(@Req() req: Request) {
19 return this.users.getMe(requireUser(req));
20 }
21
22 @Get("me/profile")
23 meProfile(@Req() req: Request) {
24 return this.users.getMe(requireUser(req));
25 }
26
27 @Patch("me")
28 updateMe(
29 @Req() req: Request,
30 @Body(ZodValidate(UpdateProfileDto)) body: UpdateProfileInput
31 ) {
32 return this.users.updateProfile(requireUser(req), body);
33 }
34
35
36 @Get()
37 list(@Query(ZodValidate(ListUsersQuery)) query: ListUsersInput, @Req() req: Request) {
38 return this.users.listForWorkspace(query.workspaceId, query);
39 }
40
41
42
43 @Get("me/activity")
44 myActivity(@Req() req: Request, @Query("cursor") cursor: string | undefined, @Query("limit") limit: string | undefined) {
45 return this.users.listMyActivity(requireUser(req), { cursor, limit });
46 }
47
48
49
50
51 @Put("me/recent")
52 recordRecent(@Req() req: Request, @Body(ZodValidate(RecordRecentItemDto)) body: RecordRecentItemInput) {
53 return this.users.recordRecentItem(requireUser(req), body);
54 }
55
56
57 @Get("me/recent")
58 listRecent(@Req() req: Request) {
59 return this.users.listRecentItems(requireUser(req));
60 }
61
62
63
64 @Get("me/saved-searches")
65 listSavedSearches(@Req() req: Request) {
66 return this.users.listSavedSearches(requireUser(req));
67 }
68
69 @Post("me/saved-searches")
70 createSavedSearch(@Req() req: Request, @Body(ZodValidate(SavedSearchCreateDto)) body: SavedSearchCreateInput) {
71 return this.users.createSavedSearch(requireUser(req), body);
72 }
73
74 @Get("me/saved-searches/:id")
75 getSavedSearch(@Req() req: Request, @Param("id") id: string) {
76 return this.users.getSavedSearch(requireUser(req), id);
77 }
78
79 @Patch("me/saved-searches/:id")
80 updateSavedSearch(
81 @Req() req: Request,
82 @Param("id") id: string,
83 @Body(ZodValidate(SavedSearchUpdateDto)) body: SavedSearchUpdateInput
84 ) {
85 return this.users.updateSavedSearch(requireUser(req), id, body);
86 }
87
88 @Delete("me/saved-searches/:id")
89 deleteSavedSearch(@Req() req: Request, @Param("id") id: string) {
90 return this.users.deleteSavedSearch(requireUser(req), id);
91 }
92}
93