A social knowledge tool for researchers built on ATProto
1import { Controller } from '../../../../../shared/infrastructure/http/Controller';
2import { Request, Response } from 'express';
3import { LogoutUseCase } from '../../../application/use-cases/LogoutUseCase';
4import { CookieService } from '../../../../../shared/infrastructure/http/services/CookieService';
5
6export class LogoutController extends Controller {
7 constructor(
8 private logoutUseCase: LogoutUseCase,
9 private cookieService: CookieService,
10 ) {
11 super();
12 }
13
14 async executeImpl(req: Request, res: Response): Promise<any> {
15 try {
16 // Try to get refresh token from cookie first, then fall back to request body
17 const refreshToken =
18 this.cookieService.getRefreshToken(req) || req.body?.refreshToken;
19
20 const result = await this.logoutUseCase.execute({
21 refreshToken,
22 });
23
24 // Clear authentication cookies regardless of use case result
25 this.cookieService.clearTokens(res);
26
27 if (result.isErr()) {
28 return this.fail(res, result.error);
29 }
30
31 return this.ok(res, result.value);
32 } catch (error: any) {
33 // Always clear cookies on logout, even if there's an error
34 this.cookieService.clearTokens(res);
35
36 return this.ok(res, {
37 success: true,
38 message: 'Logged out (client-side cleanup completed)',
39 });
40 }
41 }
42}