A social knowledge tool for researchers built on ATProto
at main 1.3 kB view raw
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}