feat(saves): Публикация картинок из файлов и по внешним ссылкам
This commit is contained in:
@ -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
|
||||
}
|
||||
);
|
||||
|
||||
Reference in New Issue
Block a user