Archived
1
0

feat(saves): Публикация картинок из файлов и по внешним ссылкам

This commit is contained in:
2025-11-20 19:46:00 +03:00
parent e10f1c4a46
commit 5a4ef883ab
2 changed files with 207 additions and 1 deletions

View File

@ -173,4 +173,108 @@ export const savesController = new Elysia({ prefix: '/saves' })
description: 'Redirects to a presigned URL for downloading the file',
},
}
)
.post(
'/external',
async ({ body, user, set }) => {
if (!user) {
set.status = 401;
return { error: 'Unauthorized' };
}
try {
const save = await savesService.createFromUrl(user.id, body);
return {
id: save.id,
name: save.name,
type: save.type,
url: save.url,
visibility: save.visibility,
shareUrl: save.visibility === 'link' ? save.shareUrl : undefined,
createdAt: save.createdAt.toISOString(),
};
} catch (error) {
console.error('Error creating save from URL:', error);
const errorMessage = error instanceof Error ? error.message : 'Failed to create save from URL';
if (errorMessage.includes('Unsupported') || errorMessage.includes('not found')) {
set.status = 400;
} else if (errorMessage.includes('Failed to download') || errorMessage.includes('Failed to scrape')) {
set.status = 502;
} else {
set.status = 500;
}
return { error: errorMessage };
}
},
{
body: t.Object({
url: t.String({ format: 'uri' }),
name: t.Optional(t.String()),
description: t.Optional(t.String()),
tags: t.Optional(t.Array(t.String())),
visibility: t.Optional(t.Union([t.Literal('public'), t.Literal('link')])),
}),
detail: {
tags: ['Saves'],
summary: 'Create save from external URL',
description: 'Downloads and saves a media file from external source',
},
auth: true
}
)
.post(
'/upload',
async ({ body, user, set }) => {
if (!user) {
set.status = 401;
return { error: 'Unauthorized' };
}
try {
const { file, name, description, tags, visibility } = body;
const save = await savesService.createFromFile(user.id, file, {
name,
description,
tags,
visibility,
});
return {
id: save.id,
name: save.name,
type: save.type,
url: save.url,
visibility: save.visibility,
shareUrl: save.visibility === 'link' ? save.shareUrl : undefined,
createdAt: save.createdAt.toISOString(),
};
} catch (error) {
set.status = 500;
return {
error: error instanceof Error ? error.message : 'Failed to upload file'
};
}
},
{
body: t.Object({
file: t.File(),
name: t.Optional(t.String()),
description: t.Optional(t.String()),
tags: t.Optional(t.Array(t.String())),
visibility: t.Optional(t.Union([t.Literal('public'), t.Literal('link')])),
}),
type: 'multipart/form-data',
detail: {
tags: ['Saves'],
summary: 'Upload file',
description: 'Uploads a media file from device',
},
auth: true
}
);