Archived
1
0

feat/saves-service Добавлен CRUD для сохранений #4

Merged
mrqiz merged 3 commits from feat/saves-service into lord 2025-11-20 21:34:49 +03:00
2 changed files with 369 additions and 1 deletions
Showing only changes of commit b8b56a4abb - Show all commits

View File

@ -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(
'/:id',
async ({ params: { id }, body, user, set }) => {

View File

@ -4,7 +4,6 @@ import { s3Service } from './s3.service';
import { scraperService } from './scraper.service';
import { redis } from './redis.service';
import { nanoid } from 'nanoid';
import type {
Visibility,
CreateSaveFromUrlRequest,
@ -203,6 +202,20 @@ class SavesService {
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(
savedItem: Save,
requestUserId?: string,