Skip to content
Merged
Show file tree
Hide file tree
Changes from 7 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions app-config.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,7 @@ logging:
s3Storage: info
middlewares: info
policies: info
domain: info

s3:
accessKeyId: 'secret'
Expand Down
19 changes: 12 additions & 7 deletions src/domain/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,7 @@ import AIService from './service/ai.js';
import EditorToolsService from '@domain/service/editorTools.js';
import FileUploaderService from './service/fileUploader.service.js';
import NoteVisitsService from './service/noteVisits.js';
import { PinoDomainLoggerAdapter } from '@infrastructure/logging/pinoLoggerAdapter.js';

/**
* Interface for initiated services
Expand Down Expand Up @@ -60,19 +61,23 @@ export interface DomainServices {
* @param appConfig - app config
*/
export function init(repositories: Repositories, appConfig: AppConfig): DomainServices {
/** Create a shared logger instance for all domain services */
const domainLogger = new PinoDomainLoggerAdapter();

/**
* @todo use shared methods for uncoupling repositories unrelated to note service
*/
const noteService = new NoteService(repositories.noteRepository, repositories.noteRelationsRepository, repositories.noteVisitsRepository, repositories.editorToolsRepository, repositories.noteHistoryRepository);
const noteVisitsService = new NoteVisitsService(repositories.noteVisitsRepository);
const noteService = new NoteService(repositories.noteRepository, repositories.noteRelationsRepository, repositories.noteVisitsRepository, repositories.editorToolsRepository, repositories.noteHistoryRepository, domainLogger);
const noteVisitsService = new NoteVisitsService(repositories.noteVisitsRepository, domainLogger);
const authService = new AuthService(
appConfig.auth.accessSecret,
appConfig.auth.accessExpiresIn,
appConfig.auth.refreshExpiresIn,
repositories.userSessionRepository
repositories.userSessionRepository,
domainLogger
);
const editorToolsService = new EditorToolsService(repositories.editorToolsRepository);
const fileUploaderService = new FileUploaderService(repositories.objectStorageRepository, repositories.fileRepository);
const editorToolsService = new EditorToolsService(repositories.editorToolsRepository, domainLogger);
const fileUploaderService = new FileUploaderService(repositories.objectStorageRepository, repositories.fileRepository, domainLogger);

const sharedServices = {
editorTools: editorToolsService,
Expand All @@ -83,8 +88,8 @@ export function init(repositories: Repositories, appConfig: AppConfig): DomainSe
*/
};

const userService = new UserService(repositories.userRepository, sharedServices);
const noteSettingsService = new NoteSettingsService(repositories.noteSettingsRepository, repositories.teamRepository, sharedServices);
const userService = new UserService(repositories.userRepository, sharedServices, domainLogger);
const noteSettingsService = new NoteSettingsService(repositories.noteSettingsRepository, repositories.teamRepository, sharedServices, domainLogger);
const aiService = new AIService(repositories.aiRepository);

return {
Expand Down
18 changes: 17 additions & 1 deletion src/domain/service/auth.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import type AuthPayload from '@domain/entities/authPayload.js';
import { nanoid } from 'nanoid';
import type UserSessionRepository from '@repository/userSession.repository.js';
import type UserSession from '@domain/entities/userSession.js';
import type { DomainLogger } from './shared/logger.js';

/**
* Auth service
Expand All @@ -28,18 +29,25 @@ export default class AuthService {
*/
private readonly userSessionRepository: UserSessionRepository;

/**
* Logger instance
*/
private readonly logger: DomainLogger;

/**
* Creates jwt service instance
* @param accessSecret - access token secret key
* @param accessTokenExpiresIn - access token expiration time
* @param refreshTokenExpiresIn - refresh token expiration time
* @param userSessionRepository - user session repository instance
* @param logger - domain logger
*/
constructor(accessSecret: string, accessTokenExpiresIn: number, refreshTokenExpiresIn: number, userSessionRepository: UserSessionRepository) {
constructor(accessSecret: string, accessTokenExpiresIn: number, refreshTokenExpiresIn: number, userSessionRepository: UserSessionRepository, logger: DomainLogger) {
this.accessSecret = accessSecret;
this.accessExpiresIn = accessTokenExpiresIn;
this.refreshExpiresIn = refreshTokenExpiresIn;
this.userSessionRepository = userSessionRepository;
this.logger = logger;
}

/**
Expand Down Expand Up @@ -77,6 +85,10 @@ export default class AuthService {

const userSession = await this.userSessionRepository.addUserSession(userId, token, new Date(Date.now() + this.refreshExpiresIn));

this.logger.debug('Refresh token issued', {
userId,
});

return userSession.refreshToken;
}

Expand All @@ -101,6 +113,8 @@ export default class AuthService {
if (session.refreshTokenExpiresAt.getTime() < Date.now()) {
await this.userSessionRepository.removeUserSessionByRefreshToken(token);

this.logger.warn('Refresh token expired');
Comment thread
neSpecc marked this conversation as resolved.
Outdated

return null;
}

Expand All @@ -113,5 +127,7 @@ export default class AuthService {
*/
public async removeSessionByRefreshToken(token: string): Promise<void> {
await this.userSessionRepository.removeUserSessionByRefreshToken(token);

this.logger.debug('Session revoked');
}
}
19 changes: 17 additions & 2 deletions src/domain/service/editorTools.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import type EditorTool from '@domain/entities/editorTools.js';
import type EditorToolsServiceSharedMethods from './shared/editorTools.js';
import type User from '@domain/entities/user.js';
import type { EditorToolCreationAttributes } from '@domain/entities/editorTools.js';
import type { DomainLogger } from './shared/logger.js';

/**
* Editor tools service
Expand All @@ -13,12 +14,19 @@ export default class EditorToolsService implements EditorToolsServiceSharedMetho
*/
private readonly repository: EditorToolsRepository;

/**
* Logger instance
*/
private readonly logger: DomainLogger;

/**
* Editor tools service constructor
* @param repository - user repository instance
* @param logger - domain logger
*/
constructor(repository: EditorToolsRepository) {
constructor(repository: EditorToolsRepository, logger: DomainLogger) {
this.repository = repository;
this.logger = logger;
}

/**
Expand Down Expand Up @@ -58,9 +66,16 @@ export default class EditorToolsService implements EditorToolsServiceSharedMetho
* @returns editor tool data
*/
public async addTool(editorTool: Omit<EditorToolCreationAttributes, 'userId'>, userId: User['id']): Promise<EditorTool> {
return await this.repository.addTool({
const createdTool = await this.repository.addTool({
userId,
...editorTool,
});

this.logger.info('Editor tool created', {
toolId: createdTool.id,
userId,
});

return createdTool;
}
}
24 changes: 23 additions & 1 deletion src/domain/service/fileUploader.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import type ObjectRepository from '@repository/object.repository.js';
import { DomainError } from '@domain/entities/DomainError.js';
import mime from 'mime';
import { isEmpty } from '@infrastructure/utils/empty.js';
import type { DomainLogger } from './shared/logger.js';

/**
* File data for upload
Expand Down Expand Up @@ -40,14 +41,21 @@ export default class FileUploaderService {
*/
private readonly fileRepository: FileRepository;

/**
* Logger instance
*/
private readonly logger: DomainLogger;

/**
* File uploader service constructor
* @param objectRepository - repository for objects
* @param fileRepository - repository for files data
* @param logger - domain logger
*/
constructor(objectRepository: ObjectRepository, fileRepository: FileRepository) {
constructor(objectRepository: ObjectRepository, fileRepository: FileRepository, logger: DomainLogger) {
this.objectRepository = objectRepository;
this.fileRepository = fileRepository;
this.logger = logger;
}

/**
Expand Down Expand Up @@ -96,6 +104,14 @@ export default class FileUploaderService {
throw new DomainError('File was not uploaded');
}

this.logger.info('File uploaded', {
key: file.key,
type,
size: fileData.data.length,
bucket,
userId: file.metadata.userId,
});

return file.key;
}

Expand Down Expand Up @@ -170,6 +186,12 @@ export default class FileUploaderService {
if (isRemovedFromObjectStorage === false || isRemovedFromDatabase === false) {
throw new DomainError('Cannot delete file');
}

this.logger.info('File deleted', {
key,
type: fileType,
bucket,
});
}

/**
Expand Down
51 changes: 48 additions & 3 deletions src/domain/service/note.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import type { NoteList } from '@domain/entities/noteList.js';
import type NoteHistoryRepository from '@repository/noteHistory.repository.js';
import type { NoteHistoryMeta, NoteHistoryRecord, NoteHistoryPublic } from '@domain/entities/noteHistory.js';
import type { NoteHierarchy } from '@domain/entities/NoteHierarchy.js';
import type { DomainLogger } from './shared/logger.js';

/**
* Note service
Expand Down Expand Up @@ -40,6 +41,11 @@ export default class NoteService {
*/
public noteHistoryRepository: NoteHistoryRepository;

/**
* Logger instance
*/
private logger: DomainLogger;

/**
* Number of the notes to be displayed on one page
* it is used to calculate offset and limit for getting notes that the user has recently opened
Expand All @@ -58,13 +64,15 @@ export default class NoteService {
* @param noteVisitsRepository - note visits repository
* @param editorToolsRepository - editor tools repositoryn
* @param noteHistoryRepository - note history repository
* @param logger - domain logger
*/
constructor(noteRepository: NoteRepository, noteRelationsRepository: NoteRelationsRepository, noteVisitsRepository: NoteVisitsRepository, editorToolsRepository: EditorToolsRepository, noteHistoryRepository: NoteHistoryRepository) {
constructor(noteRepository: NoteRepository, noteRelationsRepository: NoteRelationsRepository, noteVisitsRepository: NoteVisitsRepository, editorToolsRepository: EditorToolsRepository, noteHistoryRepository: NoteHistoryRepository, logger: DomainLogger) {
this.noteRepository = noteRepository;
this.noteRelationsRepository = noteRelationsRepository;
this.noteVisitsRepository = noteVisitsRepository;
this.editorToolsRepository = editorToolsRepository;
this.noteHistoryRepository = noteHistoryRepository;
this.logger = logger;
}

/**
Expand Down Expand Up @@ -103,6 +111,12 @@ export default class NoteService {
await this.noteRelationsRepository.addNoteRelation(note.id, parentNote.id);
}

this.logger.info('Note created', {
noteId: note.id,
creatorId,
parentPublicId,
});

return note;
}

Expand Down Expand Up @@ -139,6 +153,11 @@ export default class NoteService {
throw new DomainError(`Note with id ${id} was not deleted`);
}

this.logger.info('Note deleted', {
noteId: id,
hadRelation: hasRelation,
});

return isNoteDeleted;
}

Expand Down Expand Up @@ -168,6 +187,11 @@ export default class NoteService {
throw new DomainError(`Note with id ${id} was not updated`);
}

this.logger.debug('Note updated', {
noteId: id,
userId,
});

return updatedNote;
}

Expand All @@ -176,7 +200,13 @@ export default class NoteService {
* @param noteId - id of note to unlink parent
*/
public async unlinkParent(noteId: NoteInternalId): Promise<boolean> {
return this.noteRelationsRepository.unlinkParent(noteId);
const result = await this.noteRelationsRepository.unlinkParent(noteId);

this.logger.info('Note parent unlinked', {
noteId,
});

return result;
}

/**
Expand Down Expand Up @@ -292,6 +322,11 @@ export default class NoteService {
throw new DomainError(`Relation was not created`);
}

this.logger.info('Note relation created', {
noteId,
parentNoteId: parentNote.id,
});

return parentNote;
}

Expand All @@ -301,6 +336,8 @@ export default class NoteService {
* @param parentPublicId - id of the new parent note
*/
public async updateNoteRelation(noteId: NoteInternalId, parentPublicId: NotePublicId): Promise<boolean> {
const currentParentId = await this.noteRelationsRepository.getParentNoteIdByNoteId(noteId);

const parentNote = await this.noteRepository.getNoteByPublicId(parentPublicId);

if (parentNote === null) {
Expand All @@ -320,7 +357,15 @@ export default class NoteService {
parentNoteId = await this.noteRelationsRepository.getParentNoteIdByNoteId(parentNoteId);
}

return await this.noteRelationsRepository.updateNoteRelationById(noteId, parentNote.id);
const result = await this.noteRelationsRepository.updateNoteRelationById(noteId, parentNote.id);

this.logger.info('Note relation changed', {
noteId,
oldParentId: currentParentId ?? undefined,
newParentId: parentNote.id,
});

return result;
};

/**
Expand Down
Loading
Loading