fix issues in core
This commit is contained in:
@@ -11,7 +11,6 @@ import type { Logger, UseCaseOutputPort } from '@core/shared/application';
|
||||
import { Result } from '@core/shared/application/Result';
|
||||
import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode';
|
||||
import { Media } from '../../domain/entities/Media';
|
||||
import { MediaUrl } from '../../domain/value-objects/MediaUrl';
|
||||
|
||||
interface TestOutputPort extends UseCaseOutputPort<DeleteMediaResult> {
|
||||
present: Mock;
|
||||
|
||||
@@ -43,7 +43,7 @@ export class DeleteMediaUseCase {
|
||||
const media = await this.mediaRepo.findById(input.mediaId);
|
||||
|
||||
if (!media) {
|
||||
return Result.err({
|
||||
return Result.err<void, DeleteMediaApplicationError>({
|
||||
code: 'MEDIA_NOT_FOUND',
|
||||
details: { message: 'Media not found' },
|
||||
});
|
||||
@@ -65,14 +65,13 @@ export class DeleteMediaUseCase {
|
||||
} catch (error) {
|
||||
const err = error instanceof Error ? error : new Error(String(error));
|
||||
|
||||
this.logger.error('[DeleteMediaUseCase] Error deleting media', {
|
||||
error: err.message,
|
||||
this.logger.error('[DeleteMediaUseCase] Error deleting media', err, {
|
||||
mediaId: input.mediaId,
|
||||
});
|
||||
|
||||
return Result.err({
|
||||
return Result.err<void, DeleteMediaApplicationError>({
|
||||
code: 'REPOSITORY_ERROR',
|
||||
details: { message: err.message ?? 'Unexpected repository error' },
|
||||
details: { message: err.message || 'Unexpected repository error' },
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -10,7 +10,6 @@ import type { Logger, UseCaseOutputPort } from '@core/shared/application';
|
||||
import { Result } from '@core/shared/application/Result';
|
||||
import type { ApplicationErrorCode } from '@core/shared/errors/ApplicationErrorCode';
|
||||
import { Media } from '../../domain/entities/Media';
|
||||
import { MediaUrl } from '../../domain/value-objects/MediaUrl';
|
||||
|
||||
interface TestOutputPort extends UseCaseOutputPort<GetMediaResult> {
|
||||
present: Mock;
|
||||
@@ -71,7 +70,7 @@ describe('GetMediaUseCase', () => {
|
||||
originalName: 'file.png',
|
||||
mimeType: 'image/png',
|
||||
size: 123,
|
||||
url: MediaUrl.create('https://example.com/file.png'),
|
||||
url: 'https://example.com/file.png',
|
||||
type: 'image',
|
||||
uploadedBy: 'user-1',
|
||||
});
|
||||
|
||||
@@ -48,26 +48,29 @@ export class GetMediaUseCase {
|
||||
const media = await this.mediaRepo.findById(input.mediaId);
|
||||
|
||||
if (!media) {
|
||||
return Result.err({
|
||||
return Result.err<void, ApplicationErrorCode<GetMediaErrorCode, { message: string }>>({
|
||||
code: 'MEDIA_NOT_FOUND',
|
||||
details: { message: 'Media not found' },
|
||||
});
|
||||
}
|
||||
|
||||
this.output.present({
|
||||
media: {
|
||||
id: media.id,
|
||||
filename: media.filename,
|
||||
originalName: media.originalName,
|
||||
mimeType: media.mimeType,
|
||||
size: media.size,
|
||||
url: media.url.value,
|
||||
type: media.type,
|
||||
uploadedBy: media.uploadedBy,
|
||||
uploadedAt: media.uploadedAt,
|
||||
metadata: media.metadata,
|
||||
},
|
||||
});
|
||||
const mediaResult: GetMediaResult['media'] = {
|
||||
id: media.id,
|
||||
filename: media.filename,
|
||||
originalName: media.originalName,
|
||||
mimeType: media.mimeType,
|
||||
size: media.size,
|
||||
url: media.url.value,
|
||||
type: media.type,
|
||||
uploadedBy: media.uploadedBy,
|
||||
uploadedAt: media.uploadedAt,
|
||||
};
|
||||
|
||||
if (media.metadata !== undefined) {
|
||||
mediaResult.metadata = media.metadata;
|
||||
}
|
||||
|
||||
this.output.present({ media: mediaResult });
|
||||
|
||||
return Result.ok(undefined);
|
||||
} catch (error) {
|
||||
@@ -76,7 +79,7 @@ export class GetMediaUseCase {
|
||||
mediaId: input.mediaId,
|
||||
});
|
||||
|
||||
return Result.err({
|
||||
return Result.err<void, ApplicationErrorCode<GetMediaErrorCode, { message: string }>>({
|
||||
code: 'REPOSITORY_ERROR',
|
||||
details: { message: err.message },
|
||||
});
|
||||
|
||||
@@ -56,13 +56,18 @@ export class RequestAvatarGenerationUseCase {
|
||||
|
||||
try {
|
||||
const requestId = uuidv4();
|
||||
const request = AvatarGenerationRequest.create({
|
||||
const requestProps: Parameters<typeof AvatarGenerationRequest.create>[0] = {
|
||||
id: requestId,
|
||||
userId: input.userId,
|
||||
facePhotoUrl: input.facePhotoData,
|
||||
suitColor: input.suitColor,
|
||||
style: input.style,
|
||||
});
|
||||
};
|
||||
|
||||
if (input.style !== undefined) {
|
||||
requestProps.style = input.style;
|
||||
}
|
||||
|
||||
const request = AvatarGenerationRequest.create(requestProps);
|
||||
|
||||
await this.avatarRepo.save(request);
|
||||
|
||||
@@ -77,7 +82,7 @@ export class RequestAvatarGenerationUseCase {
|
||||
request.fail(errorMessage);
|
||||
await this.avatarRepo.save(request);
|
||||
|
||||
return Result.err({
|
||||
return Result.err<void, RequestAvatarGenerationApplicationError>({
|
||||
code: 'FACE_VALIDATION_FAILED',
|
||||
details: { message: errorMessage },
|
||||
});
|
||||
@@ -101,7 +106,7 @@ export class RequestAvatarGenerationUseCase {
|
||||
request.fail(errorMessage);
|
||||
await this.avatarRepo.save(request);
|
||||
|
||||
return Result.err({
|
||||
return Result.err<void, RequestAvatarGenerationApplicationError>({
|
||||
code: 'GENERATION_FAILED',
|
||||
details: { message: errorMessage },
|
||||
});
|
||||
|
||||
@@ -46,14 +46,14 @@ export class SelectAvatarUseCase {
|
||||
const request = await this.avatarRepo.findById(input.requestId);
|
||||
|
||||
if (!request) {
|
||||
return Result.err({
|
||||
return Result.err<void, SelectAvatarApplicationError>({
|
||||
code: 'REQUEST_NOT_FOUND',
|
||||
details: { message: 'Avatar generation request not found' },
|
||||
});
|
||||
}
|
||||
|
||||
if (request.status !== 'completed') {
|
||||
return Result.err({
|
||||
return Result.err<void, SelectAvatarApplicationError>({
|
||||
code: 'REQUEST_NOT_COMPLETED',
|
||||
details: { message: 'Avatar generation is not completed yet' },
|
||||
});
|
||||
@@ -62,7 +62,7 @@ export class SelectAvatarUseCase {
|
||||
request.selectAvatar(input.selectedIndex);
|
||||
await this.avatarRepo.save(request);
|
||||
|
||||
const selectedAvatarUrl = request.selectedAvatarUrl;
|
||||
const selectedAvatarUrl = request.selectedAvatarUrl!;
|
||||
|
||||
this.output.present({
|
||||
requestId: input.requestId,
|
||||
|
||||
@@ -69,8 +69,8 @@ export class UploadMediaUseCase {
|
||||
}
|
||||
const uploadResult = await this.mediaStorage.uploadMedia(input.file.buffer, uploadOptions);
|
||||
|
||||
if (!uploadResult.success) {
|
||||
return Result.err({
|
||||
if (!uploadResult.success || !uploadResult.url) {
|
||||
return Result.err<void, ApplicationErrorCode<UploadMediaErrorCode, { message: string }>>({
|
||||
code: 'UPLOAD_FAILED',
|
||||
details: {
|
||||
message:
|
||||
@@ -88,7 +88,7 @@ export class UploadMediaUseCase {
|
||||
|
||||
// Create media entity
|
||||
const mediaId = uuidv4();
|
||||
const media = Media.create({
|
||||
const mediaProps: Parameters<typeof Media.create>[0] = {
|
||||
id: mediaId,
|
||||
filename: uploadResult.filename || input.file.originalname,
|
||||
originalName: input.file.originalname,
|
||||
@@ -97,8 +97,13 @@ export class UploadMediaUseCase {
|
||||
url: uploadResult.url,
|
||||
type: mediaType,
|
||||
uploadedBy: input.uploadedBy,
|
||||
metadata: input.metadata,
|
||||
});
|
||||
};
|
||||
|
||||
if (input.metadata !== undefined) {
|
||||
mediaProps.metadata = input.metadata;
|
||||
}
|
||||
|
||||
const media = Media.create(mediaProps);
|
||||
|
||||
// Save to repository
|
||||
await this.mediaRepo.save(media);
|
||||
@@ -121,7 +126,7 @@ export class UploadMediaUseCase {
|
||||
filename: input.file.originalname,
|
||||
});
|
||||
|
||||
return Result.err({
|
||||
return Result.err<void, ApplicationErrorCode<UploadMediaErrorCode, { message: string }>>({
|
||||
code: 'REPOSITORY_ERROR',
|
||||
details: { message: err.message },
|
||||
});
|
||||
|
||||
Reference in New Issue
Block a user