fix issues in core

This commit is contained in:
2025-12-23 11:25:08 +01:00
parent 1efd971032
commit 2854ae3c5c
113 changed files with 1142 additions and 458 deletions

View File

@@ -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;

View File

@@ -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' },
});
}
}

View File

@@ -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',
});

View File

@@ -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 },
});

View File

@@ -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 },
});

View File

@@ -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,

View File

@@ -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 },
});