From ef4a492cb14424de3a791004af6604a795e1eae9 Mon Sep 17 00:00:00 2001
From: Daniel Dietzler <36593685+danieldietzler@users.noreply.github.com>
Date: Thu, 21 Mar 2024 00:07:30 +0100
Subject: [PATCH] chore(server): move services (#8133)

move services
---
 .vscode/settings.json                         |  4 ++
 .../jobs/specs/library-watcher.e2e-spec.ts    |  2 +-
 server/src/apps/api.service.ts                | 14 +++---
 server/src/apps/app.module.ts                 | 48 +++++++++----------
 server/src/apps/microservices.service.ts      | 26 +++++-----
 server/src/commands/list-users.command.ts     |  2 +-
 server/src/commands/oauth-login.ts            |  2 +-
 server/src/commands/password-login.ts         |  2 +-
 .../commands/reset-admin-password.command.ts  |  2 +-
 server/src/controllers/activity.controller.ts |  2 +-
 server/src/controllers/album.controller.ts    |  2 +-
 server/src/controllers/api-key.controller.ts  |  2 +-
 server/src/controllers/app.controller.ts      |  2 +-
 server/src/controllers/asset.controller.ts    |  4 +-
 server/src/controllers/audit.controller.ts    |  2 +-
 server/src/controllers/auth.controller.ts     |  2 +-
 server/src/controllers/download.controller.ts |  2 +-
 server/src/controllers/face.controller.ts     |  2 +-
 server/src/controllers/job.controller.ts      |  2 +-
 server/src/controllers/library.controller.ts  |  2 +-
 server/src/controllers/oauth.controller.ts    |  2 +-
 server/src/controllers/partner.controller.ts  |  2 +-
 server/src/controllers/person.controller.ts   |  2 +-
 server/src/controllers/search.controller.ts   |  2 +-
 .../src/controllers/server-info.controller.ts |  2 +-
 .../src/controllers/shared-link.controller.ts |  2 +-
 .../controllers/system-config.controller.ts   |  4 +-
 server/src/controllers/tag.controller.ts      |  2 +-
 server/src/controllers/trash.controller.ts    |  2 +-
 server/src/controllers/user.controller.ts     |  2 +-
 .../system-config-map-theme.dto.ts            |  0
 .../src/immich/api-v1/asset/asset.service.ts  |  2 +-
 server/src/middleware/auth.guard.ts           |  2 +-
 .../src/middleware/file-upload.interceptor.ts |  2 +-
 .../repositories/communication.repository.ts  |  2 +-
 .../activity.service.spec.ts}                 |  2 +-
 .../activity => services}/activity.service.ts |  0
 .../album => services}/album.service.spec.ts  |  2 +-
 .../album => services}/album.service.ts       |  0
 .../api-key.service.spec.ts                   |  2 +-
 .../api-key => services}/api-key.service.ts   |  0
 .../asset => services}/asset.service.spec.ts  |  2 +-
 .../asset => services}/asset.service.ts       |  0
 .../audit => services}/audit.service.spec.ts  |  2 +-
 .../audit => services}/audit.service.ts       |  0
 .../auth => services}/auth.service.spec.ts    |  2 +-
 .../{domain/auth => services}/auth.service.ts |  0
 .../database.service.spec.ts                  |  2 +-
 .../database => services}/database.service.ts |  0
 .../download.service.spec.ts                  |  2 +-
 .../download => services}/download.service.ts |  0
 .../job => services}/job.service.spec.ts      |  2 +-
 .../{domain/job => services}/job.service.ts   |  0
 .../library.service.spec.ts                   |  2 +-
 .../library => services}/library.service.ts   |  0
 .../media => services}/media.service.spec.ts  |  2 +-
 .../media => services}/media.service.ts       |  0
 .../metadata.service.spec.ts                  |  2 +-
 .../metadata => services}/metadata.service.ts |  0
 .../partner.service.spec.ts                   |  2 +-
 .../partner => services}/partner.service.ts   |  0
 .../person.service.spec.ts                    |  2 +-
 .../person => services}/person.service.ts     |  0
 .../search.service.spec.ts                    |  2 +-
 .../search => services}/search.service.ts     |  0
 .../server-info.service.spec.ts               |  2 +-
 .../server-info.service.ts                    |  0
 .../shared-link.service.spec.ts               |  2 +-
 .../shared-link.service.ts                    |  0
 .../smart-info.service.spec.ts                |  2 +-
 .../smart-info.service.ts                     |  0
 .../storage-template.service.spec.ts          |  2 +-
 .../storage-template.service.ts               |  0
 .../storage.service.spec.ts                   |  2 +-
 .../storage => services}/storage.service.ts   |  0
 .../system-config.service.spec.ts             |  2 +-
 .../system-config.service.ts                  |  0
 .../tag => services}/tag.service.spec.ts      |  2 +-
 .../{domain/tag => services}/tag.service.ts   |  0
 .../trash => services}/trash.service.spec.ts  |  2 +-
 .../trash => services}/trash.service.ts       |  0
 .../user => services}/user.service.spec.ts    |  2 +-
 .../{domain/user => services}/user.service.ts |  0
 83 files changed, 104 insertions(+), 100 deletions(-)
 rename server/src/{domain/system-config => dtos}/system-config-map-theme.dto.ts (100%)
 rename server/src/{domain/activity/activity.spec.ts => services/activity.service.spec.ts} (98%)
 rename server/src/{domain/activity => services}/activity.service.ts (100%)
 rename server/src/{domain/album => services}/album.service.spec.ts (99%)
 rename server/src/{domain/album => services}/album.service.ts (100%)
 rename server/src/{domain/api-key => services}/api-key.service.spec.ts (98%)
 rename server/src/{domain/api-key => services}/api-key.service.ts (100%)
 rename server/src/{domain/asset => services}/asset.service.spec.ts (99%)
 rename server/src/{domain/asset => services}/asset.service.ts (100%)
 rename server/src/{domain/audit => services}/audit.service.spec.ts (98%)
 rename server/src/{domain/audit => services}/audit.service.ts (100%)
 rename server/src/{domain/auth => services}/auth.service.spec.ts (99%)
 rename server/src/{domain/auth => services}/auth.service.ts (100%)
 rename server/src/{domain/database => services}/database.service.spec.ts (99%)
 rename server/src/{domain/database => services}/database.service.ts (100%)
 rename server/src/{domain/download => services}/download.service.spec.ts (99%)
 rename server/src/{domain/download => services}/download.service.ts (100%)
 rename server/src/{domain/job => services}/job.service.spec.ts (99%)
 rename server/src/{domain/job => services}/job.service.ts (100%)
 rename server/src/{domain/library => services}/library.service.spec.ts (99%)
 rename server/src/{domain/library => services}/library.service.ts (100%)
 rename server/src/{domain/media => services}/media.service.spec.ts (99%)
 rename server/src/{domain/media => services}/media.service.ts (100%)
 rename server/src/{domain/metadata => services}/metadata.service.spec.ts (99%)
 rename server/src/{domain/metadata => services}/metadata.service.ts (100%)
 rename server/src/{domain/partner => services}/partner.service.spec.ts (98%)
 rename server/src/{domain/partner => services}/partner.service.ts (100%)
 rename server/src/{domain/person => services}/person.service.spec.ts (99%)
 rename server/src/{domain/person => services}/person.service.ts (100%)
 rename server/src/{domain/search => services}/search.service.spec.ts (99%)
 rename server/src/{domain/search => services}/search.service.ts (100%)
 rename server/src/{domain/server-info => services}/server-info.service.spec.ts (99%)
 rename server/src/{domain/server-info => services}/server-info.service.ts (100%)
 rename server/src/{domain/shared-link => services}/shared-link.service.spec.ts (99%)
 rename server/src/{domain/shared-link => services}/shared-link.service.ts (100%)
 rename server/src/{domain/smart-info => services}/smart-info.service.spec.ts (98%)
 rename server/src/{domain/smart-info => services}/smart-info.service.ts (100%)
 rename server/src/{domain/storage-template => services}/storage-template.service.spec.ts (99%)
 rename server/src/{domain/storage-template => services}/storage-template.service.ts (100%)
 rename server/src/{domain/storage => services}/storage.service.spec.ts (95%)
 rename server/src/{domain/storage => services}/storage.service.ts (100%)
 rename server/src/{domain/system-config => services}/system-config.service.spec.ts (99%)
 rename server/src/{domain/system-config => services}/system-config.service.ts (100%)
 rename server/src/{domain/tag => services}/tag.service.spec.ts (99%)
 rename server/src/{domain/tag => services}/tag.service.ts (100%)
 rename server/src/{domain/trash => services}/trash.service.spec.ts (98%)
 rename server/src/{domain/trash => services}/trash.service.ts (100%)
 rename server/src/{domain/user => services}/user.service.spec.ts (99%)
 rename server/src/{domain/user => services}/user.service.ts (100%)

diff --git a/.vscode/settings.json b/.vscode/settings.json
index eae6e1a16d..3267c67132 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -27,4 +27,8 @@
   "cSpell.words": [
     "immich"
   ],
+  "explorer.fileNesting.enabled": true,
+  "explorer.fileNesting.patterns": {
+    "*.ts": "${capture}.spec.ts,${capture}.mock.ts"
+  }
 }
\ No newline at end of file
diff --git a/server/e2e/jobs/specs/library-watcher.e2e-spec.ts b/server/e2e/jobs/specs/library-watcher.e2e-spec.ts
index 0a005c7d54..5ce0868b9f 100644
--- a/server/e2e/jobs/specs/library-watcher.e2e-spec.ts
+++ b/server/e2e/jobs/specs/library-watcher.e2e-spec.ts
@@ -1,12 +1,12 @@
 import { api } from 'e2e/client';
 import fs from 'node:fs/promises';
 import path from 'node:path';
-import { LibraryService } from 'src/domain/library/library.service';
 import { LoginResponseDto } from 'src/dtos/auth.dto';
 import { LibraryResponseDto } from 'src/dtos/library.dto';
 import { AssetType } from 'src/entities/asset.entity';
 import { LibraryType } from 'src/entities/library.entity';
 import { StorageEventType } from 'src/interfaces/storage.repository';
+import { LibraryService } from 'src/services/library.service';
 import {
   IMMICH_TEST_ASSET_PATH,
   IMMICH_TEST_ASSET_TEMP_PATH,
diff --git a/server/src/apps/api.service.ts b/server/src/apps/api.service.ts
index 31134cefad..fbd0d0e4a7 100644
--- a/server/src/apps/api.service.ts
+++ b/server/src/apps/api.service.ts
@@ -3,15 +3,15 @@ import { Cron, CronExpression, Interval } from '@nestjs/schedule';
 import { NextFunction, Request, Response } from 'express';
 import { readFileSync } from 'node:fs';
 import { join } from 'node:path';
-import { AuthService } from 'src/domain/auth/auth.service';
-import { DatabaseService } from 'src/domain/database/database.service';
 import { ONE_HOUR, WEB_ROOT } from 'src/domain/domain.constant';
-import { JobService } from 'src/domain/job/job.service';
-import { ServerInfoService } from 'src/domain/server-info/server-info.service';
-import { SharedLinkService } from 'src/domain/shared-link/shared-link.service';
-import { StorageService } from 'src/domain/storage/storage.service';
-import { SystemConfigService } from 'src/domain/system-config/system-config.service';
 import { ImmichLogger } from 'src/infra/logger';
+import { AuthService } from 'src/services/auth.service';
+import { DatabaseService } from 'src/services/database.service';
+import { JobService } from 'src/services/job.service';
+import { ServerInfoService } from 'src/services/server-info.service';
+import { SharedLinkService } from 'src/services/shared-link.service';
+import { StorageService } from 'src/services/storage.service';
+import { SystemConfigService } from 'src/services/system-config.service';
 import { OpenGraphTags } from 'src/utils';
 
 const render = (index: string, meta: OpenGraphTags) => {
diff --git a/server/src/apps/app.module.ts b/server/src/apps/app.module.ts
index f134d33632..964e2d4e11 100644
--- a/server/src/apps/app.module.ts
+++ b/server/src/apps/app.module.ts
@@ -6,30 +6,6 @@ import { ScheduleModule, SchedulerRegistry } from '@nestjs/schedule';
 import { TypeOrmModule } from '@nestjs/typeorm';
 import { OpenTelemetryModule } from 'nestjs-otel';
 import { bullConfig, bullQueues, immichAppConfig } from 'src/config';
-import { ActivityService } from 'src/domain/activity/activity.service';
-import { AlbumService } from 'src/domain/album/album.service';
-import { APIKeyService } from 'src/domain/api-key/api-key.service';
-import { AssetService } from 'src/domain/asset/asset.service';
-import { AuditService } from 'src/domain/audit/audit.service';
-import { AuthService } from 'src/domain/auth/auth.service';
-import { DatabaseService } from 'src/domain/database/database.service';
-import { DownloadService } from 'src/domain/download/download.service';
-import { JobService } from 'src/domain/job/job.service';
-import { LibraryService } from 'src/domain/library/library.service';
-import { MediaService } from 'src/domain/media/media.service';
-import { MetadataService } from 'src/domain/metadata/metadata.service';
-import { PartnerService } from 'src/domain/partner/partner.service';
-import { PersonService } from 'src/domain/person/person.service';
-import { SearchService } from 'src/domain/search/search.service';
-import { ServerInfoService } from 'src/domain/server-info/server-info.service';
-import { SharedLinkService } from 'src/domain/shared-link/shared-link.service';
-import { SmartInfoService } from 'src/domain/smart-info/smart-info.service';
-import { StorageTemplateService } from 'src/domain/storage-template/storage-template.service';
-import { StorageService } from 'src/domain/storage/storage.service';
-import { SystemConfigService } from 'src/domain/system-config/system-config.service';
-import { TagService } from 'src/domain/tag/tag.service';
-import { TrashService } from 'src/domain/trash/trash.service';
-import { UserService } from 'src/domain/user/user.service';
 import { databaseEntities } from 'src/entities';
 import { databaseConfig } from 'src/infra/database.config';
 import { otelConfig } from 'src/infra/instrumentation';
@@ -88,6 +64,30 @@ import { SystemMetadataRepository } from 'src/repositories/system-metadata.repos
 import { TagRepository } from 'src/repositories/tag.repository';
 import { UserTokenRepository } from 'src/repositories/user-token.repository';
 import { UserRepository } from 'src/repositories/user.repository';
+import { ActivityService } from 'src/services/activity.service';
+import { AlbumService } from 'src/services/album.service';
+import { APIKeyService } from 'src/services/api-key.service';
+import { AssetService } from 'src/services/asset.service';
+import { AuditService } from 'src/services/audit.service';
+import { AuthService } from 'src/services/auth.service';
+import { DatabaseService } from 'src/services/database.service';
+import { DownloadService } from 'src/services/download.service';
+import { JobService } from 'src/services/job.service';
+import { LibraryService } from 'src/services/library.service';
+import { MediaService } from 'src/services/media.service';
+import { MetadataService } from 'src/services/metadata.service';
+import { PartnerService } from 'src/services/partner.service';
+import { PersonService } from 'src/services/person.service';
+import { SearchService } from 'src/services/search.service';
+import { ServerInfoService } from 'src/services/server-info.service';
+import { SharedLinkService } from 'src/services/shared-link.service';
+import { SmartInfoService } from 'src/services/smart-info.service';
+import { StorageTemplateService } from 'src/services/storage-template.service';
+import { StorageService } from 'src/services/storage.service';
+import { SystemConfigService } from 'src/services/system-config.service';
+import { TagService } from 'src/services/tag.service';
+import { TrashService } from 'src/services/trash.service';
+import { UserService } from 'src/services/user.service';
 
 const services: Provider[] = [
   APIKeyService,
diff --git a/server/src/apps/microservices.service.ts b/server/src/apps/microservices.service.ts
index bfdc37576b..8f11583beb 100644
--- a/server/src/apps/microservices.service.ts
+++ b/server/src/apps/microservices.service.ts
@@ -1,20 +1,20 @@
 import { Injectable } from '@nestjs/common';
-import { AssetService } from 'src/domain/asset/asset.service';
-import { AuditService } from 'src/domain/audit/audit.service';
-import { DatabaseService } from 'src/domain/database/database.service';
 import { JobName } from 'src/domain/job/job.constants';
 import { IDeleteFilesJob } from 'src/domain/job/job.interface';
-import { JobService } from 'src/domain/job/job.service';
-import { LibraryService } from 'src/domain/library/library.service';
-import { MediaService } from 'src/domain/media/media.service';
-import { MetadataService } from 'src/domain/metadata/metadata.service';
-import { PersonService } from 'src/domain/person/person.service';
-import { SmartInfoService } from 'src/domain/smart-info/smart-info.service';
-import { StorageTemplateService } from 'src/domain/storage-template/storage-template.service';
-import { StorageService } from 'src/domain/storage/storage.service';
-import { SystemConfigService } from 'src/domain/system-config/system-config.service';
-import { UserService } from 'src/domain/user/user.service';
 import { otelSDK } from 'src/infra/instrumentation';
+import { AssetService } from 'src/services/asset.service';
+import { AuditService } from 'src/services/audit.service';
+import { DatabaseService } from 'src/services/database.service';
+import { JobService } from 'src/services/job.service';
+import { LibraryService } from 'src/services/library.service';
+import { MediaService } from 'src/services/media.service';
+import { MetadataService } from 'src/services/metadata.service';
+import { PersonService } from 'src/services/person.service';
+import { SmartInfoService } from 'src/services/smart-info.service';
+import { StorageTemplateService } from 'src/services/storage-template.service';
+import { StorageService } from 'src/services/storage.service';
+import { SystemConfigService } from 'src/services/system-config.service';
+import { UserService } from 'src/services/user.service';
 
 @Injectable()
 export class MicroservicesService {
diff --git a/server/src/commands/list-users.command.ts b/server/src/commands/list-users.command.ts
index 222833fad2..32bcc35d95 100644
--- a/server/src/commands/list-users.command.ts
+++ b/server/src/commands/list-users.command.ts
@@ -1,6 +1,6 @@
 import { Command, CommandRunner } from 'nest-commander';
-import { UserService } from 'src/domain/user/user.service';
 import { UserEntity } from 'src/entities/user.entity';
+import { UserService } from 'src/services/user.service';
 
 @Command({
   name: 'list-users',
diff --git a/server/src/commands/oauth-login.ts b/server/src/commands/oauth-login.ts
index 12562fae18..c9bb4d5ef4 100644
--- a/server/src/commands/oauth-login.ts
+++ b/server/src/commands/oauth-login.ts
@@ -1,5 +1,5 @@
 import { Command, CommandRunner } from 'nest-commander';
-import { SystemConfigService } from 'src/domain/system-config/system-config.service';
+import { SystemConfigService } from 'src/services/system-config.service';
 
 @Command({
   name: 'enable-oauth-login',
diff --git a/server/src/commands/password-login.ts b/server/src/commands/password-login.ts
index 953a1293ad..3d992f8583 100644
--- a/server/src/commands/password-login.ts
+++ b/server/src/commands/password-login.ts
@@ -1,5 +1,5 @@
 import { Command, CommandRunner } from 'nest-commander';
-import { SystemConfigService } from 'src/domain/system-config/system-config.service';
+import { SystemConfigService } from 'src/services/system-config.service';
 
 @Command({
   name: 'enable-password-login',
diff --git a/server/src/commands/reset-admin-password.command.ts b/server/src/commands/reset-admin-password.command.ts
index b67ef418e5..a186603a3f 100644
--- a/server/src/commands/reset-admin-password.command.ts
+++ b/server/src/commands/reset-admin-password.command.ts
@@ -1,6 +1,6 @@
 import { Command, CommandRunner, InquirerService, Question, QuestionSet } from 'nest-commander';
-import { UserService } from 'src/domain/user/user.service';
 import { UserResponseDto } from 'src/dtos/user.dto';
+import { UserService } from 'src/services/user.service';
 
 @Command({
   name: 'reset-admin-password',
diff --git a/server/src/controllers/activity.controller.ts b/server/src/controllers/activity.controller.ts
index 92e8797aad..a65b284ca1 100644
--- a/server/src/controllers/activity.controller.ts
+++ b/server/src/controllers/activity.controller.ts
@@ -1,7 +1,6 @@
 import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Post, Query, Res } from '@nestjs/common';
 import { ApiTags } from '@nestjs/swagger';
 import { Response } from 'express';
-import { ActivityService } from 'src/domain/activity/activity.service';
 import {
   ActivityCreateDto,
   ActivityDto,
@@ -11,6 +10,7 @@ import {
 } from 'src/dtos/activity.dto';
 import { AuthDto } from 'src/dtos/auth.dto';
 import { Auth, Authenticated } from 'src/middleware/auth.guard';
+import { ActivityService } from 'src/services/activity.service';
 import { UUIDParamDto } from 'src/validation';
 
 @ApiTags('Activity')
diff --git a/server/src/controllers/album.controller.ts b/server/src/controllers/album.controller.ts
index 7cc39a860d..c4b11fbb4c 100644
--- a/server/src/controllers/album.controller.ts
+++ b/server/src/controllers/album.controller.ts
@@ -1,6 +1,5 @@
 import { Body, Controller, Delete, Get, Param, Patch, Post, Put, Query } from '@nestjs/common';
 import { ApiTags } from '@nestjs/swagger';
-import { AlbumService } from 'src/domain/album/album.service';
 import {
   AddUsersDto,
   AlbumCountResponseDto,
@@ -13,6 +12,7 @@ import {
 import { BulkIdResponseDto, BulkIdsDto } from 'src/dtos/asset-ids.response.dto';
 import { AuthDto } from 'src/dtos/auth.dto';
 import { Auth, Authenticated, SharedLinkRoute } from 'src/middleware/auth.guard';
+import { AlbumService } from 'src/services/album.service';
 import { ParseMeUUIDPipe, UUIDParamDto } from 'src/validation';
 
 @ApiTags('Album')
diff --git a/server/src/controllers/api-key.controller.ts b/server/src/controllers/api-key.controller.ts
index 9b6838f8d2..564b903874 100644
--- a/server/src/controllers/api-key.controller.ts
+++ b/server/src/controllers/api-key.controller.ts
@@ -1,9 +1,9 @@
 import { Body, Controller, Delete, Get, Param, Post, Put } from '@nestjs/common';
 import { ApiTags } from '@nestjs/swagger';
-import { APIKeyService } from 'src/domain/api-key/api-key.service';
 import { APIKeyCreateDto, APIKeyCreateResponseDto, APIKeyResponseDto, APIKeyUpdateDto } from 'src/dtos/api-key.dto';
 import { AuthDto } from 'src/dtos/auth.dto';
 import { Auth, Authenticated } from 'src/middleware/auth.guard';
+import { APIKeyService } from 'src/services/api-key.service';
 import { UUIDParamDto } from 'src/validation';
 
 @ApiTags('API Key')
diff --git a/server/src/controllers/app.controller.ts b/server/src/controllers/app.controller.ts
index d4c7ea5b48..472d0da3f7 100644
--- a/server/src/controllers/app.controller.ts
+++ b/server/src/controllers/app.controller.ts
@@ -1,7 +1,7 @@
 import { Controller, Get, Header } from '@nestjs/common';
 import { ApiExcludeEndpoint } from '@nestjs/swagger';
-import { SystemConfigService } from 'src/domain/system-config/system-config.service';
 import { PublicRoute } from 'src/middleware/auth.guard';
+import { SystemConfigService } from 'src/services/system-config.service';
 
 @Controller()
 export class AppController {
diff --git a/server/src/controllers/asset.controller.ts b/server/src/controllers/asset.controller.ts
index ca44aedfe9..37e1691137 100644
--- a/server/src/controllers/asset.controller.ts
+++ b/server/src/controllers/asset.controller.ts
@@ -1,7 +1,5 @@
 import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Post, Put, Query } from '@nestjs/common';
 import { ApiOperation, ApiTags } from '@nestjs/swagger';
-import { AssetService } from 'src/domain/asset/asset.service';
-import { SearchService } from 'src/domain/search/search.service';
 import { AssetResponseDto, MemoryLaneResponseDto } from 'src/dtos/asset-response.dto';
 import {
   AssetBulkDeleteDto,
@@ -19,6 +17,8 @@ import { UpdateStackParentDto } from 'src/dtos/stack.dto';
 import { TimeBucketAssetDto, TimeBucketDto, TimeBucketResponseDto } from 'src/dtos/time-bucket.dto';
 import { Auth, Authenticated, SharedLinkRoute } from 'src/middleware/auth.guard';
 import { Route } from 'src/middleware/file-upload.interceptor';
+import { AssetService } from 'src/services/asset.service';
+import { SearchService } from 'src/services/search.service';
 import { UUIDParamDto } from 'src/validation';
 
 @ApiTags('Asset')
diff --git a/server/src/controllers/audit.controller.ts b/server/src/controllers/audit.controller.ts
index b4d27b4ce7..1487e78d47 100644
--- a/server/src/controllers/audit.controller.ts
+++ b/server/src/controllers/audit.controller.ts
@@ -1,6 +1,5 @@
 import { Body, Controller, Get, Post, Query } from '@nestjs/common';
 import { ApiTags } from '@nestjs/swagger';
-import { AuditService } from 'src/domain/audit/audit.service';
 import {
   AuditDeletesDto,
   AuditDeletesResponseDto,
@@ -11,6 +10,7 @@ import {
 } from 'src/dtos/audit.dto';
 import { AuthDto } from 'src/dtos/auth.dto';
 import { AdminRoute, Auth, Authenticated } from 'src/middleware/auth.guard';
+import { AuditService } from 'src/services/audit.service';
 
 @ApiTags('Audit')
 @Controller('audit')
diff --git a/server/src/controllers/auth.controller.ts b/server/src/controllers/auth.controller.ts
index 6197c1e5fe..cbb649dc08 100644
--- a/server/src/controllers/auth.controller.ts
+++ b/server/src/controllers/auth.controller.ts
@@ -2,7 +2,6 @@ import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Post, Req,
 import { ApiTags } from '@nestjs/swagger';
 import { Request, Response } from 'express';
 import { IMMICH_ACCESS_COOKIE, IMMICH_AUTH_TYPE_COOKIE, IMMICH_IS_AUTHENTICATED } from 'src/domain/auth/auth.constant';
-import { AuthService, LoginDetails } from 'src/domain/auth/auth.service';
 import {
   AuthDeviceResponseDto,
   AuthDto,
@@ -15,6 +14,7 @@ import {
 } from 'src/dtos/auth.dto';
 import { UserResponseDto, mapUser } from 'src/dtos/user.dto';
 import { Auth, Authenticated, GetLoginDetails, PublicRoute } from 'src/middleware/auth.guard';
+import { AuthService, LoginDetails } from 'src/services/auth.service';
 import { UUIDParamDto } from 'src/validation';
 
 @ApiTags('Authentication')
diff --git a/server/src/controllers/download.controller.ts b/server/src/controllers/download.controller.ts
index 8ba5d4281a..66cdc1facd 100644
--- a/server/src/controllers/download.controller.ts
+++ b/server/src/controllers/download.controller.ts
@@ -1,12 +1,12 @@
 import { Body, Controller, HttpCode, HttpStatus, Next, Param, Post, Res, StreamableFile } from '@nestjs/common';
 import { ApiTags } from '@nestjs/swagger';
 import { NextFunction, Response } from 'express';
-import { DownloadService } from 'src/domain/download/download.service';
 import { AssetIdsDto } from 'src/dtos/asset.dto';
 import { AuthDto } from 'src/dtos/auth.dto';
 import { DownloadInfoDto, DownloadResponseDto } from 'src/dtos/download.dto';
 import { asStreamableFile, sendFile } from 'src/immich/app.utils';
 import { Auth, Authenticated, FileResponse, SharedLinkRoute } from 'src/middleware/auth.guard';
+import { DownloadService } from 'src/services/download.service';
 import { UUIDParamDto } from 'src/validation';
 
 @ApiTags('Download')
diff --git a/server/src/controllers/face.controller.ts b/server/src/controllers/face.controller.ts
index d5712d6b79..a3f33fb867 100644
--- a/server/src/controllers/face.controller.ts
+++ b/server/src/controllers/face.controller.ts
@@ -1,9 +1,9 @@
 import { Body, Controller, Get, Param, Put, Query } from '@nestjs/common';
 import { ApiTags } from '@nestjs/swagger';
-import { PersonService } from 'src/domain/person/person.service';
 import { AuthDto } from 'src/dtos/auth.dto';
 import { AssetFaceResponseDto, FaceDto, PersonResponseDto } from 'src/dtos/person.dto';
 import { Auth, Authenticated } from 'src/middleware/auth.guard';
+import { PersonService } from 'src/services/person.service';
 import { UUIDParamDto } from 'src/validation';
 
 @ApiTags('Face')
diff --git a/server/src/controllers/job.controller.ts b/server/src/controllers/job.controller.ts
index 04dea79eec..d6bd45b1e8 100644
--- a/server/src/controllers/job.controller.ts
+++ b/server/src/controllers/job.controller.ts
@@ -1,8 +1,8 @@
 import { Body, Controller, Get, Param, Put } from '@nestjs/common';
 import { ApiTags } from '@nestjs/swagger';
-import { JobService } from 'src/domain/job/job.service';
 import { AllJobStatusResponseDto, JobCommandDto, JobIdParamDto, JobStatusDto } from 'src/dtos/job.dto';
 import { Authenticated } from 'src/middleware/auth.guard';
+import { JobService } from 'src/services/job.service';
 
 @ApiTags('Job')
 @Controller('jobs')
diff --git a/server/src/controllers/library.controller.ts b/server/src/controllers/library.controller.ts
index 96c5f74152..70d357187e 100644
--- a/server/src/controllers/library.controller.ts
+++ b/server/src/controllers/library.controller.ts
@@ -1,6 +1,5 @@
 import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, Post, Put, Query } from '@nestjs/common';
 import { ApiTags } from '@nestjs/swagger';
-import { LibraryService } from 'src/domain/library/library.service';
 import {
   CreateLibraryDto,
   LibraryResponseDto,
@@ -12,6 +11,7 @@ import {
   ValidateLibraryResponseDto,
 } from 'src/dtos/library.dto';
 import { AdminRoute, Authenticated } from 'src/middleware/auth.guard';
+import { LibraryService } from 'src/services/library.service';
 import { UUIDParamDto } from 'src/validation';
 
 @ApiTags('Library')
diff --git a/server/src/controllers/oauth.controller.ts b/server/src/controllers/oauth.controller.ts
index 6da9faa173..debbd4e676 100644
--- a/server/src/controllers/oauth.controller.ts
+++ b/server/src/controllers/oauth.controller.ts
@@ -1,7 +1,6 @@
 import { Body, Controller, Get, HttpStatus, Post, Redirect, Req, Res } from '@nestjs/common';
 import { ApiTags } from '@nestjs/swagger';
 import { Request, Response } from 'express';
-import { AuthService, LoginDetails } from 'src/domain/auth/auth.service';
 import {
   AuthDto,
   LoginResponseDto,
@@ -11,6 +10,7 @@ import {
 } from 'src/dtos/auth.dto';
 import { UserResponseDto } from 'src/dtos/user.dto';
 import { Auth, Authenticated, GetLoginDetails, PublicRoute } from 'src/middleware/auth.guard';
+import { AuthService, LoginDetails } from 'src/services/auth.service';
 
 @ApiTags('OAuth')
 @Controller('oauth')
diff --git a/server/src/controllers/partner.controller.ts b/server/src/controllers/partner.controller.ts
index c4f22a04f0..c7d5613f70 100644
--- a/server/src/controllers/partner.controller.ts
+++ b/server/src/controllers/partner.controller.ts
@@ -1,10 +1,10 @@
 import { Body, Controller, Delete, Get, Param, Post, Put, Query } from '@nestjs/common';
 import { ApiQuery, ApiTags } from '@nestjs/swagger';
-import { PartnerService } from 'src/domain/partner/partner.service';
 import { AuthDto } from 'src/dtos/auth.dto';
 import { PartnerResponseDto, UpdatePartnerDto } from 'src/dtos/partner.dto';
 import { PartnerDirection } from 'src/interfaces/partner.repository';
 import { Auth, Authenticated } from 'src/middleware/auth.guard';
+import { PartnerService } from 'src/services/partner.service';
 import { UUIDParamDto } from 'src/validation';
 
 @ApiTags('Partner')
diff --git a/server/src/controllers/person.controller.ts b/server/src/controllers/person.controller.ts
index 9c5602091a..5e45fc929a 100644
--- a/server/src/controllers/person.controller.ts
+++ b/server/src/controllers/person.controller.ts
@@ -1,7 +1,6 @@
 import { Body, Controller, Get, Next, Param, Post, Put, Query, Res } from '@nestjs/common';
 import { ApiTags } from '@nestjs/swagger';
 import { NextFunction, Response } from 'express';
-import { PersonService } from 'src/domain/person/person.service';
 import { BulkIdResponseDto } from 'src/dtos/asset-ids.response.dto';
 import { AssetResponseDto } from 'src/dtos/asset-response.dto';
 import { AuthDto } from 'src/dtos/auth.dto';
@@ -18,6 +17,7 @@ import {
 } from 'src/dtos/person.dto';
 import { sendFile } from 'src/immich/app.utils';
 import { Auth, Authenticated, FileResponse } from 'src/middleware/auth.guard';
+import { PersonService } from 'src/services/person.service';
 import { UUIDParamDto } from 'src/validation';
 
 @ApiTags('Person')
diff --git a/server/src/controllers/search.controller.ts b/server/src/controllers/search.controller.ts
index 6b88f5ad81..eaf45be293 100644
--- a/server/src/controllers/search.controller.ts
+++ b/server/src/controllers/search.controller.ts
@@ -1,6 +1,5 @@
 import { Body, Controller, Get, HttpCode, HttpStatus, Post, Query } from '@nestjs/common';
 import { ApiOperation, ApiTags } from '@nestjs/swagger';
-import { SearchService } from 'src/domain/search/search.service';
 import { AssetResponseDto } from 'src/dtos/asset-response.dto';
 import { AuthDto } from 'src/dtos/auth.dto';
 import { PersonResponseDto } from 'src/dtos/person.dto';
@@ -16,6 +15,7 @@ import {
   SmartSearchDto,
 } from 'src/dtos/search.dto';
 import { Auth, Authenticated } from 'src/middleware/auth.guard';
+import { SearchService } from 'src/services/search.service';
 
 @ApiTags('Search')
 @Controller('search')
diff --git a/server/src/controllers/server-info.controller.ts b/server/src/controllers/server-info.controller.ts
index 9937acde8a..e32b0d191c 100644
--- a/server/src/controllers/server-info.controller.ts
+++ b/server/src/controllers/server-info.controller.ts
@@ -1,6 +1,5 @@
 import { Controller, Get, HttpCode, HttpStatus, Post } from '@nestjs/common';
 import { ApiTags } from '@nestjs/swagger';
-import { ServerInfoService } from 'src/domain/server-info/server-info.service';
 import {
   ServerConfigDto,
   ServerFeaturesDto,
@@ -12,6 +11,7 @@ import {
   ServerVersionResponseDto,
 } from 'src/dtos/server-info.dto';
 import { AdminRoute, Authenticated, PublicRoute } from 'src/middleware/auth.guard';
+import { ServerInfoService } from 'src/services/server-info.service';
 
 @ApiTags('Server Info')
 @Controller('server-info')
diff --git a/server/src/controllers/shared-link.controller.ts b/server/src/controllers/shared-link.controller.ts
index 90bbd6ee13..61dd6605a0 100644
--- a/server/src/controllers/shared-link.controller.ts
+++ b/server/src/controllers/shared-link.controller.ts
@@ -2,7 +2,6 @@ import { Body, Controller, Delete, Get, Param, Patch, Post, Put, Query, Req, Res
 import { ApiTags } from '@nestjs/swagger';
 import { Request, Response } from 'express';
 import { IMMICH_SHARED_LINK_ACCESS_COOKIE } from 'src/domain/auth/auth.constant';
-import { SharedLinkService } from 'src/domain/shared-link/shared-link.service';
 import { AssetIdsResponseDto } from 'src/dtos/asset-ids.response.dto';
 import { AssetIdsDto } from 'src/dtos/asset.dto';
 import { AuthDto } from 'src/dtos/auth.dto';
@@ -13,6 +12,7 @@ import {
   SharedLinkResponseDto,
 } from 'src/dtos/shared-link.dto';
 import { Auth, Authenticated, SharedLinkRoute } from 'src/middleware/auth.guard';
+import { SharedLinkService } from 'src/services/shared-link.service';
 import { UUIDParamDto } from 'src/validation';
 
 @ApiTags('Shared Link')
diff --git a/server/src/controllers/system-config.controller.ts b/server/src/controllers/system-config.controller.ts
index 34f9f2e0ed..ca2bbb5f51 100644
--- a/server/src/controllers/system-config.controller.ts
+++ b/server/src/controllers/system-config.controller.ts
@@ -1,10 +1,10 @@
 import { Body, Controller, Get, Put, Query } from '@nestjs/common';
 import { ApiTags } from '@nestjs/swagger';
-import { MapThemeDto } from 'src/domain/system-config/system-config-map-theme.dto';
-import { SystemConfigService } from 'src/domain/system-config/system-config.service';
+import { MapThemeDto } from 'src/dtos/system-config-map-theme.dto';
 import { SystemConfigTemplateStorageOptionDto } from 'src/dtos/system-config-storage-template.dto';
 import { SystemConfigDto } from 'src/dtos/system-config.dto';
 import { AdminRoute, Authenticated } from 'src/middleware/auth.guard';
+import { SystemConfigService } from 'src/services/system-config.service';
 
 @ApiTags('System Config')
 @Controller('system-config')
diff --git a/server/src/controllers/tag.controller.ts b/server/src/controllers/tag.controller.ts
index bbca4a05d8..1caed8d528 100644
--- a/server/src/controllers/tag.controller.ts
+++ b/server/src/controllers/tag.controller.ts
@@ -1,12 +1,12 @@
 import { Body, Controller, Delete, Get, Param, Patch, Post, Put } from '@nestjs/common';
 import { ApiTags } from '@nestjs/swagger';
-import { TagService } from 'src/domain/tag/tag.service';
 import { AssetIdsResponseDto } from 'src/dtos/asset-ids.response.dto';
 import { AssetResponseDto } from 'src/dtos/asset-response.dto';
 import { AssetIdsDto } from 'src/dtos/asset.dto';
 import { AuthDto } from 'src/dtos/auth.dto';
 import { CreateTagDto, TagResponseDto, UpdateTagDto } from 'src/dtos/tag.dto';
 import { Auth, Authenticated } from 'src/middleware/auth.guard';
+import { TagService } from 'src/services/tag.service';
 import { UUIDParamDto } from 'src/validation';
 
 @ApiTags('Tag')
diff --git a/server/src/controllers/trash.controller.ts b/server/src/controllers/trash.controller.ts
index 5ea692d486..25df3543cc 100644
--- a/server/src/controllers/trash.controller.ts
+++ b/server/src/controllers/trash.controller.ts
@@ -1,9 +1,9 @@
 import { Body, Controller, HttpCode, HttpStatus, Post } from '@nestjs/common';
 import { ApiTags } from '@nestjs/swagger';
-import { TrashService } from 'src/domain/trash/trash.service';
 import { BulkIdsDto } from 'src/dtos/asset-ids.response.dto';
 import { AuthDto } from 'src/dtos/auth.dto';
 import { Auth, Authenticated } from 'src/middleware/auth.guard';
+import { TrashService } from 'src/services/trash.service';
 
 @ApiTags('Trash')
 @Controller('trash')
diff --git a/server/src/controllers/user.controller.ts b/server/src/controllers/user.controller.ts
index 9fc0ff320e..0663ae197b 100644
--- a/server/src/controllers/user.controller.ts
+++ b/server/src/controllers/user.controller.ts
@@ -16,13 +16,13 @@ import {
 } from '@nestjs/common';
 import { ApiBody, ApiConsumes, ApiTags } from '@nestjs/swagger';
 import { NextFunction, Response } from 'express';
-import { UserService } from 'src/domain/user/user.service';
 import { AuthDto } from 'src/dtos/auth.dto';
 import { CreateProfileImageDto, CreateProfileImageResponseDto } from 'src/dtos/user-profile.dto';
 import { CreateUserDto, DeleteUserDto, UpdateUserDto, UserResponseDto } from 'src/dtos/user.dto';
 import { sendFile } from 'src/immich/app.utils';
 import { AdminRoute, Auth, Authenticated, FileResponse } from 'src/middleware/auth.guard';
 import { FileUploadInterceptor, Route } from 'src/middleware/file-upload.interceptor';
+import { UserService } from 'src/services/user.service';
 import { UUIDParamDto } from 'src/validation';
 
 @ApiTags('User')
diff --git a/server/src/domain/system-config/system-config-map-theme.dto.ts b/server/src/dtos/system-config-map-theme.dto.ts
similarity index 100%
rename from server/src/domain/system-config/system-config-map-theme.dto.ts
rename to server/src/dtos/system-config-map-theme.dto.ts
diff --git a/server/src/immich/api-v1/asset/asset.service.ts b/server/src/immich/api-v1/asset/asset.service.ts
index ee310c3771..023017130e 100644
--- a/server/src/immich/api-v1/asset/asset.service.ts
+++ b/server/src/immich/api-v1/asset/asset.service.ts
@@ -6,7 +6,6 @@ import {
   NotFoundException,
 } from '@nestjs/common';
 import { AccessCore, Permission } from 'src/cores/access.core';
-import { UploadFile } from 'src/domain/asset/asset.service';
 import { mimeTypes } from 'src/domain/domain.constant';
 import { JobName } from 'src/domain/job/job.constants';
 import { AssetResponseDto, mapAsset } from 'src/dtos/asset-response.dto';
@@ -36,6 +35,7 @@ import { IJobRepository } from 'src/interfaces/job.repository';
 import { ILibraryRepository } from 'src/interfaces/library.repository';
 import { IStorageRepository } from 'src/interfaces/storage.repository';
 import { IUserRepository } from 'src/interfaces/user.repository';
+import { UploadFile } from 'src/services/asset.service';
 import { CacheControl, ImmichFileResponse, getLivePhotoMotionFilename } from 'src/utils';
 import { QueryFailedError } from 'typeorm';
 
diff --git a/server/src/middleware/auth.guard.ts b/server/src/middleware/auth.guard.ts
index 765e243543..48befd9a2e 100644
--- a/server/src/middleware/auth.guard.ts
+++ b/server/src/middleware/auth.guard.ts
@@ -10,9 +10,9 @@ import { Reflector } from '@nestjs/core';
 import { ApiBearerAuth, ApiCookieAuth, ApiOkResponse, ApiQuery, ApiSecurity } from '@nestjs/swagger';
 import { Request } from 'express';
 import { IMMICH_API_KEY_NAME } from 'src/domain/auth/auth.constant';
-import { AuthService, LoginDetails } from 'src/domain/auth/auth.service';
 import { AuthDto } from 'src/dtos/auth.dto';
 import { ImmichLogger } from 'src/infra/logger';
+import { AuthService, LoginDetails } from 'src/services/auth.service';
 import { UAParser } from 'ua-parser-js';
 
 export enum Metadata {
diff --git a/server/src/middleware/file-upload.interceptor.ts b/server/src/middleware/file-upload.interceptor.ts
index 9d6abaa3d1..f1d5c5c345 100644
--- a/server/src/middleware/file-upload.interceptor.ts
+++ b/server/src/middleware/file-upload.interceptor.ts
@@ -6,10 +6,10 @@ import { NextFunction, RequestHandler } from 'express';
 import multer, { StorageEngine, diskStorage } from 'multer';
 import { createHash, randomUUID } from 'node:crypto';
 import { Observable } from 'rxjs';
-import { AssetService, UploadFile } from 'src/domain/asset/asset.service';
 import { UploadFieldName } from 'src/dtos/asset.dto';
 import { ImmichLogger } from 'src/infra/logger';
 import { AuthRequest } from 'src/middleware/auth.guard';
+import { AssetService, UploadFile } from 'src/services/asset.service';
 
 export enum Route {
   ASSET = 'asset',
diff --git a/server/src/repositories/communication.repository.ts b/server/src/repositories/communication.repository.ts
index e92fe13873..549975c74c 100644
--- a/server/src/repositories/communication.repository.ts
+++ b/server/src/repositories/communication.repository.ts
@@ -7,7 +7,6 @@ import {
   WebSocketServer,
 } from '@nestjs/websockets';
 import { Server, Socket } from 'socket.io';
-import { AuthService } from 'src/domain/auth/auth.service';
 import { Instrumentation } from 'src/infra/instrumentation';
 import { ImmichLogger } from 'src/infra/logger';
 import {
@@ -18,6 +17,7 @@ import {
   OnServerEventCallback,
   ServerEvent,
 } from 'src/interfaces/communication.repository';
+import { AuthService } from 'src/services/auth.service';
 
 @Instrumentation()
 @WebSocketGateway({
diff --git a/server/src/domain/activity/activity.spec.ts b/server/src/services/activity.service.spec.ts
similarity index 98%
rename from server/src/domain/activity/activity.spec.ts
rename to server/src/services/activity.service.spec.ts
index 6013f0ff04..a36d825546 100644
--- a/server/src/domain/activity/activity.spec.ts
+++ b/server/src/services/activity.service.spec.ts
@@ -1,7 +1,7 @@
 import { BadRequestException } from '@nestjs/common';
-import { ActivityService } from 'src/domain/activity/activity.service';
 import { ReactionType } from 'src/dtos/activity.dto';
 import { IActivityRepository } from 'src/interfaces/activity.repository';
+import { ActivityService } from 'src/services/activity.service';
 import { activityStub } from 'test/fixtures/activity.stub';
 import { authStub } from 'test/fixtures/auth.stub';
 import { IAccessRepositoryMock, newAccessRepositoryMock } from 'test/repositories/access.repository.mock';
diff --git a/server/src/domain/activity/activity.service.ts b/server/src/services/activity.service.ts
similarity index 100%
rename from server/src/domain/activity/activity.service.ts
rename to server/src/services/activity.service.ts
diff --git a/server/src/domain/album/album.service.spec.ts b/server/src/services/album.service.spec.ts
similarity index 99%
rename from server/src/domain/album/album.service.spec.ts
rename to server/src/services/album.service.spec.ts
index 41b505ea6d..6a09f54d16 100644
--- a/server/src/domain/album/album.service.spec.ts
+++ b/server/src/services/album.service.spec.ts
@@ -1,10 +1,10 @@
 import { BadRequestException } from '@nestjs/common';
 import _ from 'lodash';
-import { AlbumService } from 'src/domain/album/album.service';
 import { BulkIdErrorReason } from 'src/dtos/asset-ids.response.dto';
 import { IAlbumRepository } from 'src/interfaces/album.repository';
 import { IAssetRepository } from 'src/interfaces/asset.repository';
 import { IUserRepository } from 'src/interfaces/user.repository';
+import { AlbumService } from 'src/services/album.service';
 import { albumStub } from 'test/fixtures/album.stub';
 import { authStub } from 'test/fixtures/auth.stub';
 import { userStub } from 'test/fixtures/user.stub';
diff --git a/server/src/domain/album/album.service.ts b/server/src/services/album.service.ts
similarity index 100%
rename from server/src/domain/album/album.service.ts
rename to server/src/services/album.service.ts
diff --git a/server/src/domain/api-key/api-key.service.spec.ts b/server/src/services/api-key.service.spec.ts
similarity index 98%
rename from server/src/domain/api-key/api-key.service.spec.ts
rename to server/src/services/api-key.service.spec.ts
index 0400c13a20..66dd70d0f9 100644
--- a/server/src/domain/api-key/api-key.service.spec.ts
+++ b/server/src/services/api-key.service.spec.ts
@@ -1,7 +1,7 @@
 import { BadRequestException } from '@nestjs/common';
-import { APIKeyService } from 'src/domain/api-key/api-key.service';
 import { IKeyRepository } from 'src/interfaces/api-key.repository';
 import { ICryptoRepository } from 'src/interfaces/crypto.repository';
+import { APIKeyService } from 'src/services/api-key.service';
 import { keyStub } from 'test/fixtures/api-key.stub';
 import { authStub } from 'test/fixtures/auth.stub';
 import { newKeyRepositoryMock } from 'test/repositories/api-key.repository.mock';
diff --git a/server/src/domain/api-key/api-key.service.ts b/server/src/services/api-key.service.ts
similarity index 100%
rename from server/src/domain/api-key/api-key.service.ts
rename to server/src/services/api-key.service.ts
diff --git a/server/src/domain/asset/asset.service.spec.ts b/server/src/services/asset.service.spec.ts
similarity index 99%
rename from server/src/domain/asset/asset.service.spec.ts
rename to server/src/services/asset.service.spec.ts
index a3603c3dac..3a6385c03f 100644
--- a/server/src/domain/asset/asset.service.spec.ts
+++ b/server/src/services/asset.service.spec.ts
@@ -1,6 +1,5 @@
 import { BadRequestException, UnauthorizedException } from '@nestjs/common';
 import { when } from 'jest-when';
-import { AssetService } from 'src/domain/asset/asset.service';
 import { JobName } from 'src/domain/job/job.constants';
 import { mapAsset } from 'src/dtos/asset-response.dto';
 import { AssetJobName, AssetStatsResponseDto, UploadFieldName } from 'src/dtos/asset.dto';
@@ -13,6 +12,7 @@ import { IPartnerRepository } from 'src/interfaces/partner.repository';
 import { IStorageRepository } from 'src/interfaces/storage.repository';
 import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
 import { IUserRepository } from 'src/interfaces/user.repository';
+import { AssetService } from 'src/services/asset.service';
 import { assetStackStub, assetStub } from 'test/fixtures/asset.stub';
 import { authStub } from 'test/fixtures/auth.stub';
 import { faceStub } from 'test/fixtures/face.stub';
diff --git a/server/src/domain/asset/asset.service.ts b/server/src/services/asset.service.ts
similarity index 100%
rename from server/src/domain/asset/asset.service.ts
rename to server/src/services/asset.service.ts
diff --git a/server/src/domain/audit/audit.service.spec.ts b/server/src/services/audit.service.spec.ts
similarity index 98%
rename from server/src/domain/audit/audit.service.spec.ts
rename to server/src/services/audit.service.spec.ts
index ecda57b089..14d08f9166 100644
--- a/server/src/domain/audit/audit.service.spec.ts
+++ b/server/src/services/audit.service.spec.ts
@@ -1,4 +1,3 @@
-import { AuditService } from 'src/domain/audit/audit.service';
 import { DatabaseAction, EntityType } from 'src/entities/audit.entity';
 import { IAssetRepository } from 'src/interfaces/asset.repository';
 import { IAuditRepository } from 'src/interfaces/audit.repository';
@@ -7,6 +6,7 @@ import { JobStatus } from 'src/interfaces/job.repository';
 import { IPersonRepository } from 'src/interfaces/person.repository';
 import { IStorageRepository } from 'src/interfaces/storage.repository';
 import { IUserRepository } from 'src/interfaces/user.repository';
+import { AuditService } from 'src/services/audit.service';
 import { auditStub } from 'test/fixtures/audit.stub';
 import { authStub } from 'test/fixtures/auth.stub';
 import { IAccessRepositoryMock, newAccessRepositoryMock } from 'test/repositories/access.repository.mock';
diff --git a/server/src/domain/audit/audit.service.ts b/server/src/services/audit.service.ts
similarity index 100%
rename from server/src/domain/audit/audit.service.ts
rename to server/src/services/audit.service.ts
diff --git a/server/src/domain/auth/auth.service.spec.ts b/server/src/services/auth.service.spec.ts
similarity index 99%
rename from server/src/domain/auth/auth.service.spec.ts
rename to server/src/services/auth.service.spec.ts
index 37c759937f..dc7565e4dd 100644
--- a/server/src/domain/auth/auth.service.spec.ts
+++ b/server/src/services/auth.service.spec.ts
@@ -3,7 +3,6 @@ import { IncomingHttpHeaders } from 'node:http';
 import { Issuer, generators } from 'openid-client';
 import { Socket } from 'socket.io';
 import { AuthType } from 'src/domain/auth/auth.constant';
-import { AuthService } from 'src/domain/auth/auth.service';
 import { AuthDto, SignUpDto } from 'src/dtos/auth.dto';
 import { UserEntity } from 'src/entities/user.entity';
 import { IKeyRepository } from 'src/interfaces/api-key.repository';
@@ -13,6 +12,7 @@ import { ISharedLinkRepository } from 'src/interfaces/shared-link.repository';
 import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
 import { IUserTokenRepository } from 'src/interfaces/user-token.repository';
 import { IUserRepository } from 'src/interfaces/user.repository';
+import { AuthService } from 'src/services/auth.service';
 import { keyStub } from 'test/fixtures/api-key.stub';
 import { authStub, loginResponseStub } from 'test/fixtures/auth.stub';
 import { sharedLinkStub } from 'test/fixtures/shared-link.stub';
diff --git a/server/src/domain/auth/auth.service.ts b/server/src/services/auth.service.ts
similarity index 100%
rename from server/src/domain/auth/auth.service.ts
rename to server/src/services/auth.service.ts
diff --git a/server/src/domain/database/database.service.spec.ts b/server/src/services/database.service.spec.ts
similarity index 99%
rename from server/src/domain/database/database.service.spec.ts
rename to server/src/services/database.service.spec.ts
index 191c0221b3..dac857a079 100644
--- a/server/src/domain/database/database.service.spec.ts
+++ b/server/src/services/database.service.spec.ts
@@ -1,7 +1,7 @@
-import { DatabaseService } from 'src/domain/database/database.service';
 import { Version, VersionType } from 'src/domain/domain.constant';
 import { ImmichLogger } from 'src/infra/logger';
 import { DatabaseExtension, IDatabaseRepository, VectorIndex } from 'src/interfaces/database.repository';
+import { DatabaseService } from 'src/services/database.service';
 import { newDatabaseRepositoryMock } from 'test/repositories/database.repository.mock';
 
 describe(DatabaseService.name, () => {
diff --git a/server/src/domain/database/database.service.ts b/server/src/services/database.service.ts
similarity index 100%
rename from server/src/domain/database/database.service.ts
rename to server/src/services/database.service.ts
diff --git a/server/src/domain/download/download.service.spec.ts b/server/src/services/download.service.spec.ts
similarity index 99%
rename from server/src/domain/download/download.service.spec.ts
rename to server/src/services/download.service.spec.ts
index cfdff82b91..ab83899556 100644
--- a/server/src/domain/download/download.service.spec.ts
+++ b/server/src/services/download.service.spec.ts
@@ -1,9 +1,9 @@
 import { BadRequestException } from '@nestjs/common';
 import { when } from 'jest-when';
-import { DownloadService } from 'src/domain/download/download.service';
 import { DownloadResponseDto } from 'src/dtos/download.dto';
 import { IAssetRepository } from 'src/interfaces/asset.repository';
 import { IStorageRepository } from 'src/interfaces/storage.repository';
+import { DownloadService } from 'src/services/download.service';
 import { CacheControl, ImmichFileResponse } from 'src/utils';
 import { assetStub } from 'test/fixtures/asset.stub';
 import { authStub } from 'test/fixtures/auth.stub';
diff --git a/server/src/domain/download/download.service.ts b/server/src/services/download.service.ts
similarity index 100%
rename from server/src/domain/download/download.service.ts
rename to server/src/services/download.service.ts
diff --git a/server/src/domain/job/job.service.spec.ts b/server/src/services/job.service.spec.ts
similarity index 99%
rename from server/src/domain/job/job.service.spec.ts
rename to server/src/services/job.service.spec.ts
index ec905b062d..4be9786a2d 100644
--- a/server/src/domain/job/job.service.spec.ts
+++ b/server/src/services/job.service.spec.ts
@@ -1,13 +1,13 @@
 import { BadRequestException } from '@nestjs/common';
 import { FeatureFlag, SystemConfigCore } from 'src/cores/system-config.core';
 import { JobCommand, JobName, QueueName } from 'src/domain/job/job.constants';
-import { JobService } from 'src/domain/job/job.service';
 import { SystemConfig, SystemConfigKey } from 'src/entities/system-config.entity';
 import { IAssetRepository } from 'src/interfaces/asset.repository';
 import { ICommunicationRepository } from 'src/interfaces/communication.repository';
 import { IJobRepository, JobHandler, JobItem, JobStatus } from 'src/interfaces/job.repository';
 import { IPersonRepository } from 'src/interfaces/person.repository';
 import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
+import { JobService } from 'src/services/job.service';
 import { assetStub } from 'test/fixtures/asset.stub';
 import { newAssetRepositoryMock } from 'test/repositories/asset.repository.mock';
 import { newCommunicationRepositoryMock } from 'test/repositories/communication.repository.mock';
diff --git a/server/src/domain/job/job.service.ts b/server/src/services/job.service.ts
similarity index 100%
rename from server/src/domain/job/job.service.ts
rename to server/src/services/job.service.ts
diff --git a/server/src/domain/library/library.service.spec.ts b/server/src/services/library.service.spec.ts
similarity index 99%
rename from server/src/domain/library/library.service.spec.ts
rename to server/src/services/library.service.spec.ts
index 81bf1cc867..2382d83c20 100644
--- a/server/src/domain/library/library.service.spec.ts
+++ b/server/src/services/library.service.spec.ts
@@ -5,7 +5,6 @@ import { Stats } from 'node:fs';
 import { SystemConfigCore } from 'src/cores/system-config.core';
 import { JobName } from 'src/domain/job/job.constants';
 import { ILibraryFileJob, ILibraryRefreshJob } from 'src/domain/job/job.interface';
-import { LibraryService } from 'src/domain/library/library.service';
 import { mapLibrary } from 'src/dtos/library.dto';
 import { AssetType } from 'src/entities/asset.entity';
 import { LibraryType } from 'src/entities/library.entity';
@@ -18,6 +17,7 @@ import { IJobRepository, JobStatus } from 'src/interfaces/job.repository';
 import { ILibraryRepository } from 'src/interfaces/library.repository';
 import { IStorageRepository, StorageEventType } from 'src/interfaces/storage.repository';
 import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
+import { LibraryService } from 'src/services/library.service';
 import { assetStub } from 'test/fixtures/asset.stub';
 import { authStub } from 'test/fixtures/auth.stub';
 import { libraryStub } from 'test/fixtures/library.stub';
diff --git a/server/src/domain/library/library.service.ts b/server/src/services/library.service.ts
similarity index 100%
rename from server/src/domain/library/library.service.ts
rename to server/src/services/library.service.ts
diff --git a/server/src/domain/media/media.service.spec.ts b/server/src/services/media.service.spec.ts
similarity index 99%
rename from server/src/domain/media/media.service.spec.ts
rename to server/src/services/media.service.spec.ts
index 97a6d161b5..eb9407e127 100644
--- a/server/src/domain/media/media.service.spec.ts
+++ b/server/src/services/media.service.spec.ts
@@ -1,6 +1,5 @@
 import { Stats } from 'node:fs';
 import { JobName } from 'src/domain/job/job.constants';
-import { MediaService } from 'src/domain/media/media.service';
 import { AssetType } from 'src/entities/asset.entity';
 import { ExifEntity } from 'src/entities/exif.entity';
 import {
@@ -20,6 +19,7 @@ import { IMoveRepository } from 'src/interfaces/move.repository';
 import { IPersonRepository } from 'src/interfaces/person.repository';
 import { IStorageRepository } from 'src/interfaces/storage.repository';
 import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
+import { MediaService } from 'src/services/media.service';
 import { assetStub } from 'test/fixtures/asset.stub';
 import { faceStub } from 'test/fixtures/face.stub';
 import { probeStub } from 'test/fixtures/media.stub';
diff --git a/server/src/domain/media/media.service.ts b/server/src/services/media.service.ts
similarity index 100%
rename from server/src/domain/media/media.service.ts
rename to server/src/services/media.service.ts
diff --git a/server/src/domain/metadata/metadata.service.spec.ts b/server/src/services/metadata.service.spec.ts
similarity index 99%
rename from server/src/domain/metadata/metadata.service.spec.ts
rename to server/src/services/metadata.service.spec.ts
index 2108c5fc48..a235aca040 100644
--- a/server/src/domain/metadata/metadata.service.spec.ts
+++ b/server/src/services/metadata.service.spec.ts
@@ -4,7 +4,6 @@ import { randomBytes } from 'node:crypto';
 import { Stats } from 'node:fs';
 import { constants } from 'node:fs/promises';
 import { JobName } from 'src/domain/job/job.constants';
-import { MetadataService, Orientation } from 'src/domain/metadata/metadata.service';
 import { AssetType } from 'src/entities/asset.entity';
 import { ExifEntity } from 'src/entities/exif.entity';
 import { SystemConfigKey } from 'src/entities/system-config.entity';
@@ -20,6 +19,7 @@ import { IMoveRepository } from 'src/interfaces/move.repository';
 import { IPersonRepository } from 'src/interfaces/person.repository';
 import { IStorageRepository } from 'src/interfaces/storage.repository';
 import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
+import { MetadataService, Orientation } from 'src/services/metadata.service';
 import { assetStub } from 'test/fixtures/asset.stub';
 import { fileStub } from 'test/fixtures/file.stub';
 import { probeStub } from 'test/fixtures/media.stub';
diff --git a/server/src/domain/metadata/metadata.service.ts b/server/src/services/metadata.service.ts
similarity index 100%
rename from server/src/domain/metadata/metadata.service.ts
rename to server/src/services/metadata.service.ts
diff --git a/server/src/domain/partner/partner.service.spec.ts b/server/src/services/partner.service.spec.ts
similarity index 98%
rename from server/src/domain/partner/partner.service.spec.ts
rename to server/src/services/partner.service.spec.ts
index 1256a9ca04..94ec3b0997 100644
--- a/server/src/domain/partner/partner.service.spec.ts
+++ b/server/src/services/partner.service.spec.ts
@@ -1,9 +1,9 @@
 import { BadRequestException } from '@nestjs/common';
-import { PartnerService } from 'src/domain/partner/partner.service';
 import { PartnerResponseDto } from 'src/dtos/partner.dto';
 import { UserAvatarColor } from 'src/entities/user.entity';
 import { IAccessRepository } from 'src/interfaces/access.repository';
 import { IPartnerRepository, PartnerDirection } from 'src/interfaces/partner.repository';
+import { PartnerService } from 'src/services/partner.service';
 import { authStub } from 'test/fixtures/auth.stub';
 import { partnerStub } from 'test/fixtures/partner.stub';
 import { newPartnerRepositoryMock } from 'test/repositories/partner.repository.mock';
diff --git a/server/src/domain/partner/partner.service.ts b/server/src/services/partner.service.ts
similarity index 100%
rename from server/src/domain/partner/partner.service.ts
rename to server/src/services/partner.service.ts
diff --git a/server/src/domain/person/person.service.spec.ts b/server/src/services/person.service.spec.ts
similarity index 99%
rename from server/src/domain/person/person.service.spec.ts
rename to server/src/services/person.service.spec.ts
index 3f555e34f1..7abc9f3d9a 100644
--- a/server/src/domain/person/person.service.spec.ts
+++ b/server/src/services/person.service.spec.ts
@@ -1,6 +1,5 @@
 import { BadRequestException, NotFoundException } from '@nestjs/common';
 import { JobName } from 'src/domain/job/job.constants';
-import { PersonService } from 'src/domain/person/person.service';
 import { BulkIdErrorReason } from 'src/dtos/asset-ids.response.dto';
 import { PersonResponseDto, mapFaces, mapPerson } from 'src/dtos/person.dto';
 import { AssetFaceEntity } from 'src/entities/asset-face.entity';
@@ -15,6 +14,7 @@ import { IPersonRepository } from 'src/interfaces/person.repository';
 import { FaceSearchResult, ISearchRepository } from 'src/interfaces/search.repository';
 import { IStorageRepository } from 'src/interfaces/storage.repository';
 import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
+import { PersonService } from 'src/services/person.service';
 import { CacheControl, ImmichFileResponse } from 'src/utils';
 import { assetStub } from 'test/fixtures/asset.stub';
 import { authStub } from 'test/fixtures/auth.stub';
diff --git a/server/src/domain/person/person.service.ts b/server/src/services/person.service.ts
similarity index 100%
rename from server/src/domain/person/person.service.ts
rename to server/src/services/person.service.ts
diff --git a/server/src/domain/search/search.service.spec.ts b/server/src/services/search.service.spec.ts
similarity index 99%
rename from server/src/domain/search/search.service.spec.ts
rename to server/src/services/search.service.spec.ts
index 7f83f2ff09..c7566ea945 100644
--- a/server/src/domain/search/search.service.spec.ts
+++ b/server/src/services/search.service.spec.ts
@@ -1,4 +1,3 @@
-import { SearchService } from 'src/domain/search/search.service';
 import { mapAsset } from 'src/dtos/asset-response.dto';
 import { SearchDto } from 'src/dtos/search.dto';
 import { SystemConfigKey } from 'src/entities/system-config.entity';
@@ -9,6 +8,7 @@ import { IPartnerRepository } from 'src/interfaces/partner.repository';
 import { IPersonRepository } from 'src/interfaces/person.repository';
 import { ISearchRepository } from 'src/interfaces/search.repository';
 import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
+import { SearchService } from 'src/services/search.service';
 import { assetStub } from 'test/fixtures/asset.stub';
 import { authStub } from 'test/fixtures/auth.stub';
 import { personStub } from 'test/fixtures/person.stub';
diff --git a/server/src/domain/search/search.service.ts b/server/src/services/search.service.ts
similarity index 100%
rename from server/src/domain/search/search.service.ts
rename to server/src/services/search.service.ts
diff --git a/server/src/domain/server-info/server-info.service.spec.ts b/server/src/services/server-info.service.spec.ts
similarity index 99%
rename from server/src/domain/server-info/server-info.service.spec.ts
rename to server/src/services/server-info.service.spec.ts
index 1685f8bdaf..0db7597b82 100644
--- a/server/src/domain/server-info/server-info.service.spec.ts
+++ b/server/src/services/server-info.service.spec.ts
@@ -1,5 +1,4 @@
 import { serverVersion } from 'src/domain/domain.constant';
-import { ServerInfoService } from 'src/domain/server-info/server-info.service';
 import { SystemMetadataKey } from 'src/entities/system-metadata.entity';
 import { ICommunicationRepository } from 'src/interfaces/communication.repository';
 import { IServerInfoRepository } from 'src/interfaces/server-info.repository';
@@ -7,6 +6,7 @@ import { IStorageRepository } from 'src/interfaces/storage.repository';
 import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
 import { ISystemMetadataRepository } from 'src/interfaces/system-metadata.repository';
 import { IUserRepository } from 'src/interfaces/user.repository';
+import { ServerInfoService } from 'src/services/server-info.service';
 import { newCommunicationRepositoryMock } from 'test/repositories/communication.repository.mock';
 import { newStorageRepositoryMock } from 'test/repositories/storage.repository.mock';
 import { newSystemConfigRepositoryMock } from 'test/repositories/system-config.repository.mock';
diff --git a/server/src/domain/server-info/server-info.service.ts b/server/src/services/server-info.service.ts
similarity index 100%
rename from server/src/domain/server-info/server-info.service.ts
rename to server/src/services/server-info.service.ts
diff --git a/server/src/domain/shared-link/shared-link.service.spec.ts b/server/src/services/shared-link.service.spec.ts
similarity index 99%
rename from server/src/domain/shared-link/shared-link.service.spec.ts
rename to server/src/services/shared-link.service.spec.ts
index e5e3ea6e2e..611d9b6707 100644
--- a/server/src/domain/shared-link/shared-link.service.spec.ts
+++ b/server/src/services/shared-link.service.spec.ts
@@ -1,10 +1,10 @@
 import { BadRequestException, ForbiddenException, UnauthorizedException } from '@nestjs/common';
 import _ from 'lodash';
-import { SharedLinkService } from 'src/domain/shared-link/shared-link.service';
 import { AssetIdErrorReason } from 'src/dtos/asset-ids.response.dto';
 import { SharedLinkType } from 'src/entities/shared-link.entity';
 import { ICryptoRepository } from 'src/interfaces/crypto.repository';
 import { ISharedLinkRepository } from 'src/interfaces/shared-link.repository';
+import { SharedLinkService } from 'src/services/shared-link.service';
 import { albumStub } from 'test/fixtures/album.stub';
 import { assetStub } from 'test/fixtures/asset.stub';
 import { authStub } from 'test/fixtures/auth.stub';
diff --git a/server/src/domain/shared-link/shared-link.service.ts b/server/src/services/shared-link.service.ts
similarity index 100%
rename from server/src/domain/shared-link/shared-link.service.ts
rename to server/src/services/shared-link.service.ts
diff --git a/server/src/domain/smart-info/smart-info.service.spec.ts b/server/src/services/smart-info.service.spec.ts
similarity index 98%
rename from server/src/domain/smart-info/smart-info.service.spec.ts
rename to server/src/services/smart-info.service.spec.ts
index 29ce75fb47..a1b8943f2e 100644
--- a/server/src/domain/smart-info/smart-info.service.spec.ts
+++ b/server/src/services/smart-info.service.spec.ts
@@ -1,6 +1,5 @@
 import { JobName } from 'src/domain/job/job.constants';
 import { cleanModelName, getCLIPModelInfo } from 'src/domain/smart-info/smart-info.constant';
-import { SmartInfoService } from 'src/domain/smart-info/smart-info.service';
 import { AssetEntity } from 'src/entities/asset.entity';
 import { SystemConfigKey } from 'src/entities/system-config.entity';
 import { IAssetRepository, WithoutProperty } from 'src/interfaces/asset.repository';
@@ -9,6 +8,7 @@ import { IJobRepository } from 'src/interfaces/job.repository';
 import { IMachineLearningRepository } from 'src/interfaces/machine-learning.repository';
 import { ISearchRepository } from 'src/interfaces/search.repository';
 import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
+import { SmartInfoService } from 'src/services/smart-info.service';
 import { assetStub } from 'test/fixtures/asset.stub';
 import { newAssetRepositoryMock } from 'test/repositories/asset.repository.mock';
 import { newDatabaseRepositoryMock } from 'test/repositories/database.repository.mock';
diff --git a/server/src/domain/smart-info/smart-info.service.ts b/server/src/services/smart-info.service.ts
similarity index 100%
rename from server/src/domain/smart-info/smart-info.service.ts
rename to server/src/services/smart-info.service.ts
diff --git a/server/src/domain/storage-template/storage-template.service.spec.ts b/server/src/services/storage-template.service.spec.ts
similarity index 99%
rename from server/src/domain/storage-template/storage-template.service.spec.ts
rename to server/src/services/storage-template.service.spec.ts
index ecadb3e864..b11d1f534e 100644
--- a/server/src/domain/storage-template/storage-template.service.spec.ts
+++ b/server/src/services/storage-template.service.spec.ts
@@ -1,7 +1,6 @@
 import { when } from 'jest-when';
 import { Stats } from 'node:fs';
 import { SystemConfigCore, defaults } from 'src/cores/system-config.core';
-import { StorageTemplateService } from 'src/domain/storage-template/storage-template.service';
 import { AssetPathType } from 'src/entities/move.entity';
 import { SystemConfig, SystemConfigKey } from 'src/entities/system-config.entity';
 import { IAlbumRepository } from 'src/interfaces/album.repository';
@@ -14,6 +13,7 @@ import { IPersonRepository } from 'src/interfaces/person.repository';
 import { IStorageRepository } from 'src/interfaces/storage.repository';
 import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
 import { IUserRepository } from 'src/interfaces/user.repository';
+import { StorageTemplateService } from 'src/services/storage-template.service';
 import { assetStub } from 'test/fixtures/asset.stub';
 import { userStub } from 'test/fixtures/user.stub';
 import { newAlbumRepositoryMock } from 'test/repositories/album.repository.mock';
diff --git a/server/src/domain/storage-template/storage-template.service.ts b/server/src/services/storage-template.service.ts
similarity index 100%
rename from server/src/domain/storage-template/storage-template.service.ts
rename to server/src/services/storage-template.service.ts
diff --git a/server/src/domain/storage/storage.service.spec.ts b/server/src/services/storage.service.spec.ts
similarity index 95%
rename from server/src/domain/storage/storage.service.spec.ts
rename to server/src/services/storage.service.spec.ts
index 2791c96300..4a5607efe4 100644
--- a/server/src/domain/storage/storage.service.spec.ts
+++ b/server/src/services/storage.service.spec.ts
@@ -1,5 +1,5 @@
-import { StorageService } from 'src/domain/storage/storage.service';
 import { IStorageRepository } from 'src/interfaces/storage.repository';
+import { StorageService } from 'src/services/storage.service';
 import { newStorageRepositoryMock } from 'test/repositories/storage.repository.mock';
 
 describe(StorageService.name, () => {
diff --git a/server/src/domain/storage/storage.service.ts b/server/src/services/storage.service.ts
similarity index 100%
rename from server/src/domain/storage/storage.service.ts
rename to server/src/services/storage.service.ts
diff --git a/server/src/domain/system-config/system-config.service.spec.ts b/server/src/services/system-config.service.spec.ts
similarity index 99%
rename from server/src/domain/system-config/system-config.service.spec.ts
rename to server/src/services/system-config.service.spec.ts
index f81d726eb0..b5b5875d71 100644
--- a/server/src/domain/system-config/system-config.service.spec.ts
+++ b/server/src/services/system-config.service.spec.ts
@@ -1,7 +1,6 @@
 import { BadRequestException } from '@nestjs/common';
 import { defaults } from 'src/cores/system-config.core';
 import { QueueName } from 'src/domain/job/job.constants';
-import { SystemConfigService } from 'src/domain/system-config/system-config.service';
 import {
   AudioCodec,
   CQMode,
@@ -19,6 +18,7 @@ import { ImmichLogger } from 'src/infra/logger';
 import { ICommunicationRepository, ServerEvent } from 'src/interfaces/communication.repository';
 import { ISearchRepository } from 'src/interfaces/search.repository';
 import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
+import { SystemConfigService } from 'src/services/system-config.service';
 import { newCommunicationRepositoryMock } from 'test/repositories/communication.repository.mock';
 import { newSystemConfigRepositoryMock } from 'test/repositories/system-config.repository.mock';
 
diff --git a/server/src/domain/system-config/system-config.service.ts b/server/src/services/system-config.service.ts
similarity index 100%
rename from server/src/domain/system-config/system-config.service.ts
rename to server/src/services/system-config.service.ts
diff --git a/server/src/domain/tag/tag.service.spec.ts b/server/src/services/tag.service.spec.ts
similarity index 99%
rename from server/src/domain/tag/tag.service.spec.ts
rename to server/src/services/tag.service.spec.ts
index c7aeba9f1d..0dca425c3e 100644
--- a/server/src/domain/tag/tag.service.spec.ts
+++ b/server/src/services/tag.service.spec.ts
@@ -1,9 +1,9 @@
 import { BadRequestException } from '@nestjs/common';
 import { when } from 'jest-when';
-import { TagService } from 'src/domain/tag/tag.service';
 import { AssetIdErrorReason } from 'src/dtos/asset-ids.response.dto';
 import { TagType } from 'src/entities/tag.entity';
 import { ITagRepository } from 'src/interfaces/tag.repository';
+import { TagService } from 'src/services/tag.service';
 import { assetStub } from 'test/fixtures/asset.stub';
 import { authStub } from 'test/fixtures/auth.stub';
 import { tagResponseStub, tagStub } from 'test/fixtures/tag.stub';
diff --git a/server/src/domain/tag/tag.service.ts b/server/src/services/tag.service.ts
similarity index 100%
rename from server/src/domain/tag/tag.service.ts
rename to server/src/services/tag.service.ts
diff --git a/server/src/domain/trash/trash.service.spec.ts b/server/src/services/trash.service.spec.ts
similarity index 98%
rename from server/src/domain/trash/trash.service.spec.ts
rename to server/src/services/trash.service.spec.ts
index 021c8e526a..09f668e6fd 100644
--- a/server/src/domain/trash/trash.service.spec.ts
+++ b/server/src/services/trash.service.spec.ts
@@ -1,9 +1,9 @@
 import { BadRequestException } from '@nestjs/common';
 import { JobName } from 'src/domain/job/job.constants';
-import { TrashService } from 'src/domain/trash/trash.service';
 import { IAssetRepository } from 'src/interfaces/asset.repository';
 import { ClientEvent, ICommunicationRepository } from 'src/interfaces/communication.repository';
 import { IJobRepository } from 'src/interfaces/job.repository';
+import { TrashService } from 'src/services/trash.service';
 import { assetStub } from 'test/fixtures/asset.stub';
 import { authStub } from 'test/fixtures/auth.stub';
 import { IAccessRepositoryMock, newAccessRepositoryMock } from 'test/repositories/access.repository.mock';
diff --git a/server/src/domain/trash/trash.service.ts b/server/src/services/trash.service.ts
similarity index 100%
rename from server/src/domain/trash/trash.service.ts
rename to server/src/services/trash.service.ts
diff --git a/server/src/domain/user/user.service.spec.ts b/server/src/services/user.service.spec.ts
similarity index 99%
rename from server/src/domain/user/user.service.spec.ts
rename to server/src/services/user.service.spec.ts
index 804a892c7d..51457b201e 100644
--- a/server/src/domain/user/user.service.spec.ts
+++ b/server/src/services/user.service.spec.ts
@@ -6,7 +6,6 @@ import {
 } from '@nestjs/common';
 import { when } from 'jest-when';
 import { JobName } from 'src/domain/job/job.constants';
-import { UserService } from 'src/domain/user/user.service';
 import { UpdateUserDto, mapUser } from 'src/dtos/user.dto';
 import { UserEntity, UserStatus } from 'src/entities/user.entity';
 import { IAlbumRepository } from 'src/interfaces/album.repository';
@@ -16,6 +15,7 @@ import { ILibraryRepository } from 'src/interfaces/library.repository';
 import { IStorageRepository } from 'src/interfaces/storage.repository';
 import { ISystemConfigRepository } from 'src/interfaces/system-config.repository';
 import { IUserRepository } from 'src/interfaces/user.repository';
+import { UserService } from 'src/services/user.service';
 import { CacheControl, ImmichFileResponse } from 'src/utils';
 import { authStub } from 'test/fixtures/auth.stub';
 import { systemConfigStub } from 'test/fixtures/system-config.stub';
diff --git a/server/src/domain/user/user.service.ts b/server/src/services/user.service.ts
similarity index 100%
rename from server/src/domain/user/user.service.ts
rename to server/src/services/user.service.ts