feat/saves-service Добавлен CRUD для сохранений #4
@ -175,6 +175,51 @@ export const savesController = new Elysia({ prefix: '/saves' })
|
|||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
|
.delete(
|
||||||
|
'/:id',
|
||||||
|
async ({ params: { id }, user, set }) => {
|
||||||
|
if (!user) {
|
||||||
|
set.status = 401;
|
||||||
|
return { error: 'Unauthorized' };
|
||||||
|
}
|
||||||
|
|
||||||
|
const saveId = Number(id);
|
||||||
|
if (isNaN(saveId)) {
|
||||||
|
set.status = 400;
|
||||||
|
return { error: 'Invalid save ID' };
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
await savesService.delete(saveId, user.id);
|
||||||
|
|
||||||
|
return {
|
||||||
|
success: true,
|
||||||
|
message: 'Сейв успешно удален',
|
||||||
|
};
|
||||||
|
} catch (error) {
|
||||||
|
if (error instanceof Error && error.message.includes('not found')) {
|
||||||
|
set.status = 404;
|
||||||
|
return { error: 'Save not found' };
|
||||||
|
}
|
||||||
|
set.status = 500;
|
||||||
|
return {
|
||||||
|
error: error instanceof Error ? error.message : 'Failed to delete save'
|
||||||
|
};
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
params: t.Object({
|
||||||
|
id: t.String(),
|
||||||
|
}),
|
||||||
|
detail: {
|
||||||
|
tags: ['Saves'],
|
||||||
|
summary: 'Delete save',
|
||||||
|
description: 'Deletes a save by ID (owner only)',
|
||||||
|
},
|
||||||
|
auth: true
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
.patch(
|
.patch(
|
||||||
'/:id',
|
'/:id',
|
||||||
async ({ params: { id }, body, user, set }) => {
|
async ({ params: { id }, body, user, set }) => {
|
||||||
|
|||||||
@ -4,7 +4,6 @@ import { s3Service } from './s3.service';
|
|||||||
import { scraperService } from './scraper.service';
|
import { scraperService } from './scraper.service';
|
||||||
import { redis } from './redis.service';
|
import { redis } from './redis.service';
|
||||||
import { nanoid } from 'nanoid';
|
import { nanoid } from 'nanoid';
|
||||||
|
|
||||||
import type {
|
import type {
|
||||||
Visibility,
|
Visibility,
|
||||||
CreateSaveFromUrlRequest,
|
CreateSaveFromUrlRequest,
|
||||||
@ -203,6 +202,20 @@ class SavesService {
|
|||||||
return updated;
|
return updated;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
async delete(id: number, userId: string): Promise<void> {
|
||||||
|
const savedItem = await this.getById(id, userId);
|
||||||
|
|
||||||
|
if (!savedItem || savedItem.userId !== userId) {
|
||||||
|
throw new Error('Save not found or access denied');
|
||||||
|
}
|
||||||
|
|
||||||
|
await s3Service.deleteFile(savedItem.s3Key);
|
||||||
|
|
||||||
|
await db.delete(save).where(eq(save.id, id));
|
||||||
|
|
||||||
|
await this.invalidateCache(id, userId);
|
||||||
|
}
|
||||||
|
|
||||||
private hasAccess(
|
private hasAccess(
|
||||||
savedItem: Save,
|
savedItem: Save,
|
||||||
requestUserId?: string,
|
requestUserId?: string,
|
||||||
|
|||||||
Reference in New Issue
Block a user