diff --git a/toju-app/src/app/domains/server-directory/README.md b/toju-app/src/app/domains/server-directory/README.md index 81ae2fc..ca0f51c 100644 --- a/toju-app/src/app/domains/server-directory/README.md +++ b/toju-app/src/app/domains/server-directory/README.md @@ -14,15 +14,23 @@ server-directory/ │ └── server-endpoint-state.service.ts Signal-based endpoint list, reconciliation with defaults, localStorage persistence │ ├── domain/ -│ ├── server-directory.models.ts ServerEndpoint, ServerInfo, ServerJoinAccessResponse, invite/ban/kick types -│ ├── server-directory.constants.ts CLIENT_UPDATE_REQUIRED_MESSAGE -│ └── server-endpoint-defaults.ts Default endpoint templates, URL sanitisation, reconciliation helpers +│ ├── constants/ +│ │ └── server-directory.constants.ts CLIENT_UPDATE_REQUIRED_MESSAGE +│ ├── logic/ +│ │ ├── room-signal-source.logic.ts Room → signal-source selector resolution +│ │ ├── room-signal-source.logic.spec.ts Unit tests +│ │ └── server-endpoint-defaults.logic.ts Default endpoint templates, URL sanitisation, reconciliation helpers +│ └── models/ +│ └── server-directory.model.ts ServerEndpoint, ServerInfo, ServerJoinAccessResponse, invite/ban/kick types │ ├── infrastructure/ -│ ├── server-directory-api.service.ts HTTP client for all server API calls -│ ├── server-endpoint-health.service.ts Health probe (GET /api/health with 5 s timeout, fallback to /api/servers) -│ ├── server-endpoint-compatibility.service.ts Semantic version comparison for client/server compatibility -│ └── server-endpoint-storage.service.ts localStorage read/write for endpoint list and removed-default tracking +│ ├── constants/ +│ │ └── server-directory.infrastructure.constants.ts Health-check timeout, localStorage keys +│ └── services/ +│ ├── server-directory-api.service.ts HTTP client for all server API calls +│ ├── server-endpoint-compatibility.service.ts Semantic version comparison for client/server compatibility +│ ├── server-endpoint-health.service.ts Health probe (GET /api/health with 5 s timeout, fallback to /api/servers) +│ └── server-endpoint-storage.service.ts localStorage read/write for endpoint list and removed-default tracking │ ├── feature/ │ ├── invite/ Invite creation and resolution UI @@ -45,8 +53,8 @@ graph TD Health[ServerEndpointHealthService] Compat[ServerEndpointCompatibilityService] Storage[ServerEndpointStorageService] - Defaults[server-endpoint-defaults] - Models[server-directory.models] + Defaults[server-endpoint-defaults.logic] + Models[server-directory.model] Facade --> Service Service --> API @@ -61,12 +69,12 @@ graph TD click Facade "application/facades/server-directory.facade.ts" "Thin domain boundary" _blank click Service "application/services/server-directory.service.ts" "Orchestrator" _blank click State "application/services/server-endpoint-state.service.ts" "Signal-based endpoint state" _blank - click API "infrastructure/server-directory-api.service.ts" "HTTP client for server API" _blank - click Health "infrastructure/server-endpoint-health.service.ts" "Health probe" _blank - click Compat "infrastructure/server-endpoint-compatibility.service.ts" "Version compatibility" _blank - click Storage "infrastructure/server-endpoint-storage.service.ts" "localStorage persistence" _blank - click Defaults "domain/server-endpoint-defaults.ts" "Default endpoint templates" _blank - click Models "domain/server-directory.models.ts" "Domain types" _blank + click API "infrastructure/services/server-directory-api.service.ts" "HTTP client for server API" _blank + click Health "infrastructure/services/server-endpoint-health.service.ts" "Health probe" _blank + click Compat "infrastructure/services/server-endpoint-compatibility.service.ts" "Version compatibility" _blank + click Storage "infrastructure/services/server-endpoint-storage.service.ts" "localStorage persistence" _blank + click Defaults "domain/logic/server-endpoint-defaults.logic.ts" "Default endpoint templates" _blank + click Models "domain/models/server-directory.model.ts" "Domain types" _blank ``` ## Endpoint lifecycle diff --git a/toju-app/src/app/domains/server-directory/application/services/server-directory.service.ts b/toju-app/src/app/domains/server-directory/application/services/server-directory.service.ts index 9655525..64b7d76 100644 --- a/toju-app/src/app/domains/server-directory/application/services/server-directory.service.ts +++ b/toju-app/src/app/domains/server-directory/application/services/server-directory.service.ts @@ -6,7 +6,7 @@ import { import { Observable } from 'rxjs'; import { STORAGE_KEY_CONNECTION_SETTINGS } from '../../../../core/constants'; import { User } from '../../../../shared-kernel'; -import { ServerDirectoryApiService } from '../../infrastructure/server-directory-api.service'; +import { ServerDirectoryApiService } from '../../infrastructure/services/server-directory-api.service'; import type { BanServerMemberRequest, CreateServerInviteRequest, @@ -19,15 +19,15 @@ import type { ServerJoinAccessResponse, ServerSourceSelector, UnbanServerMemberRequest -} from '../../domain/server-directory.models'; +} from '../../domain/models/server-directory.model'; import { buildRoomSignalSelector, buildRoomSignalSource, type RoomSignalSource, type RoomSignalSourceInput -} from '../../domain/room-signal-source'; -import { ServerEndpointCompatibilityService } from '../../infrastructure/server-endpoint-compatibility.service'; -import { ServerEndpointHealthService } from '../../infrastructure/server-endpoint-health.service'; +} from '../../domain/logic/room-signal-source.logic'; +import { ServerEndpointCompatibilityService } from '../../infrastructure/services/server-endpoint-compatibility.service'; +import { ServerEndpointHealthService } from '../../infrastructure/services/server-endpoint-health.service'; import { ServerEndpointStateService } from './server-endpoint-state.service'; @Injectable({ providedIn: 'root' }) diff --git a/toju-app/src/app/domains/server-directory/application/services/server-endpoint-state.service.ts b/toju-app/src/app/domains/server-directory/application/services/server-endpoint-state.service.ts index 625d188..77a5ac3 100644 --- a/toju-app/src/app/domains/server-directory/application/services/server-endpoint-state.service.ts +++ b/toju-app/src/app/domains/server-directory/application/services/server-endpoint-state.service.ts @@ -16,14 +16,14 @@ import { hasEndpointForDefault, matchDefaultEndpointTemplate, sanitiseServerBaseUrl -} from '../../domain/server-endpoint-defaults'; -import { ServerEndpointStorageService } from '../../infrastructure/server-endpoint-storage.service'; +} from '../../domain/logic/server-endpoint-defaults.logic'; +import { ServerEndpointStorageService } from '../../infrastructure/services/server-endpoint-storage.service'; import type { ConfiguredDefaultServerDefinition, DefaultEndpointTemplate, ServerEndpoint, ServerEndpointVersions -} from '../../domain/server-directory.models'; +} from '../../domain/models/server-directory.model'; function resolveDefaultHttpProtocol(): 'http' | 'https' { return typeof window !== 'undefined' && window.location?.protocol === 'https:' diff --git a/toju-app/src/app/domains/server-directory/domain/server-directory.constants.ts b/toju-app/src/app/domains/server-directory/domain/constants/server-directory.constants.ts similarity index 100% rename from toju-app/src/app/domains/server-directory/domain/server-directory.constants.ts rename to toju-app/src/app/domains/server-directory/domain/constants/server-directory.constants.ts diff --git a/toju-app/src/app/domains/server-directory/domain/room-signal-source.spec.ts b/toju-app/src/app/domains/server-directory/domain/logic/room-signal-source.logic.spec.ts similarity index 97% rename from toju-app/src/app/domains/server-directory/domain/room-signal-source.spec.ts rename to toju-app/src/app/domains/server-directory/domain/logic/room-signal-source.logic.spec.ts index f1029dc..2d7bca3 100644 --- a/toju-app/src/app/domains/server-directory/domain/room-signal-source.spec.ts +++ b/toju-app/src/app/domains/server-directory/domain/logic/room-signal-source.logic.spec.ts @@ -3,7 +3,7 @@ import { buildRoomSignalSelector, buildRoomSignalSource, getSourceUrlFromSignalingUrl -} from './room-signal-source'; +} from './room-signal-source.logic'; describe('room-signal-source helpers', () => { it('converts signaling urls back to normalized source urls', () => { diff --git a/toju-app/src/app/domains/server-directory/domain/room-signal-source.ts b/toju-app/src/app/domains/server-directory/domain/logic/room-signal-source.logic.ts similarity index 95% rename from toju-app/src/app/domains/server-directory/domain/room-signal-source.ts rename to toju-app/src/app/domains/server-directory/domain/logic/room-signal-source.logic.ts index 451277f..e457244 100644 --- a/toju-app/src/app/domains/server-directory/domain/room-signal-source.ts +++ b/toju-app/src/app/domains/server-directory/domain/logic/room-signal-source.logic.ts @@ -1,5 +1,5 @@ -import type { ServerEndpoint, ServerSourceSelector } from './server-directory.models'; -import { normaliseConfiguredServerUrl, sanitiseServerBaseUrl } from './server-endpoint-defaults'; +import type { ServerEndpoint, ServerSourceSelector } from '../models/server-directory.model'; +import { normaliseConfiguredServerUrl, sanitiseServerBaseUrl } from './server-endpoint-defaults.logic'; export interface RoomSignalSource { sourceId?: string; diff --git a/toju-app/src/app/domains/server-directory/domain/server-endpoint-defaults.ts b/toju-app/src/app/domains/server-directory/domain/logic/server-endpoint-defaults.logic.ts similarity index 99% rename from toju-app/src/app/domains/server-directory/domain/server-endpoint-defaults.ts rename to toju-app/src/app/domains/server-directory/domain/logic/server-endpoint-defaults.logic.ts index e83b1f6..fad777b 100644 --- a/toju-app/src/app/domains/server-directory/domain/server-endpoint-defaults.ts +++ b/toju-app/src/app/domains/server-directory/domain/logic/server-endpoint-defaults.logic.ts @@ -3,7 +3,7 @@ import type { DefaultEndpointTemplate, DefaultServerDefinition, ServerEndpoint -} from './server-directory.models'; +} from '../models/server-directory.model'; export function sanitiseServerBaseUrl(rawUrl: string): string { let cleaned = rawUrl.trim().replace(/\/+$/, ''); diff --git a/toju-app/src/app/domains/server-directory/domain/server-directory.models.ts b/toju-app/src/app/domains/server-directory/domain/models/server-directory.model.ts similarity index 98% rename from toju-app/src/app/domains/server-directory/domain/server-directory.models.ts rename to toju-app/src/app/domains/server-directory/domain/models/server-directory.model.ts index bd60c84..8082268 100644 --- a/toju-app/src/app/domains/server-directory/domain/server-directory.models.ts +++ b/toju-app/src/app/domains/server-directory/domain/models/server-directory.model.ts @@ -3,7 +3,7 @@ import type { ChannelPermissionOverride, RoomRole, RoomRoleAssignment -} from '../../../shared-kernel'; +} from '../../../../shared-kernel'; export type ServerEndpointStatus = 'online' | 'offline' | 'checking' | 'unknown' | 'incompatible'; diff --git a/toju-app/src/app/domains/server-directory/feature/invite/invite.component.ts b/toju-app/src/app/domains/server-directory/feature/invite/invite.component.ts index 0c3f3e1..965a42b 100644 --- a/toju-app/src/app/domains/server-directory/feature/invite/invite.component.ts +++ b/toju-app/src/app/domains/server-directory/feature/invite/invite.component.ts @@ -11,7 +11,7 @@ import { Store } from '@ngrx/store'; import { RoomsActions } from '../../../../store/rooms/rooms.actions'; import { UsersActions } from '../../../../store/users/users.actions'; import { selectCurrentUser } from '../../../../store/users/users.selectors'; -import type { ServerInviteInfo } from '../../domain/server-directory.models'; +import type { ServerInviteInfo } from '../../domain/models/server-directory.model'; import { STORAGE_KEY_CURRENT_USER_ID } from '../../../../core/constants'; import { DatabaseService } from '../../../../infrastructure/persistence'; import { ServerDirectoryFacade } from '../../application/facades/server-directory.facade'; diff --git a/toju-app/src/app/domains/server-directory/feature/server-search/server-search.component.ts b/toju-app/src/app/domains/server-directory/feature/server-search/server-search.component.ts index 9d154a7..acd92c6 100644 --- a/toju-app/src/app/domains/server-directory/feature/server-search/server-search.component.ts +++ b/toju-app/src/app/domains/server-directory/feature/server-search/server-search.component.ts @@ -36,7 +36,7 @@ import { import { Room, User } from '../../../../shared-kernel'; import { SettingsModalService } from '../../../../core/services/settings-modal.service'; import { DatabaseService } from '../../../../infrastructure/persistence'; -import { type ServerInfo } from '../../domain/server-directory.models'; +import { type ServerInfo } from '../../domain/models/server-directory.model'; import { ServerDirectoryFacade } from '../../application/facades/server-directory.facade'; import { selectCurrentUser } from '../../../../store/users/users.selectors'; import { ConfirmDialogComponent } from '../../../../shared'; diff --git a/toju-app/src/app/domains/server-directory/index.ts b/toju-app/src/app/domains/server-directory/index.ts index 39db73e..dc0464b 100644 --- a/toju-app/src/app/domains/server-directory/index.ts +++ b/toju-app/src/app/domains/server-directory/index.ts @@ -1,4 +1,4 @@ export * from './application/facades/server-directory.facade'; -export * from './domain/server-directory.constants'; -export * from './domain/server-directory.models'; -export * from './domain/room-signal-source'; +export * from './domain/constants/server-directory.constants'; +export * from './domain/models/server-directory.model'; +export * from './domain/logic/room-signal-source.logic'; diff --git a/toju-app/src/app/domains/server-directory/infrastructure/server-directory.infrastructure.constants.ts b/toju-app/src/app/domains/server-directory/infrastructure/constants/server-directory.infrastructure.constants.ts similarity index 100% rename from toju-app/src/app/domains/server-directory/infrastructure/server-directory.infrastructure.constants.ts rename to toju-app/src/app/domains/server-directory/infrastructure/constants/server-directory.infrastructure.constants.ts diff --git a/toju-app/src/app/domains/server-directory/infrastructure/server-directory-api.service.ts b/toju-app/src/app/domains/server-directory/infrastructure/services/server-directory-api.service.ts similarity index 98% rename from toju-app/src/app/domains/server-directory/infrastructure/server-directory-api.service.ts rename to toju-app/src/app/domains/server-directory/infrastructure/services/server-directory-api.service.ts index 7c82ed8..a560821 100644 --- a/toju-app/src/app/domains/server-directory/infrastructure/server-directory-api.service.ts +++ b/toju-app/src/app/domains/server-directory/infrastructure/services/server-directory-api.service.ts @@ -15,8 +15,8 @@ import { RoomRole, RoomRoleAssignment, User -} from '../../../shared-kernel'; -import { ServerEndpointStateService } from '../application/services/server-endpoint-state.service'; +} from '../../../../shared-kernel'; +import { ServerEndpointStateService } from '../../application/services/server-endpoint-state.service'; import type { BanServerMemberRequest, CreateServerInviteRequest, @@ -28,8 +28,8 @@ import type { ServerJoinAccessResponse, ServerSourceSelector, UnbanServerMemberRequest -} from '../domain/server-directory.models'; -import type { RoomSignalSourceInput } from '../domain/room-signal-source'; +} from '../../domain/models/server-directory.model'; +import type { RoomSignalSourceInput } from '../../domain/logic/room-signal-source.logic'; @Injectable({ providedIn: 'root' }) export class ServerDirectoryApiService { diff --git a/toju-app/src/app/domains/server-directory/infrastructure/server-endpoint-compatibility.service.ts b/toju-app/src/app/domains/server-directory/infrastructure/services/server-endpoint-compatibility.service.ts similarity index 89% rename from toju-app/src/app/domains/server-directory/infrastructure/server-endpoint-compatibility.service.ts rename to toju-app/src/app/domains/server-directory/infrastructure/services/server-endpoint-compatibility.service.ts index 481fde8..a5c00bd 100644 --- a/toju-app/src/app/domains/server-directory/infrastructure/server-endpoint-compatibility.service.ts +++ b/toju-app/src/app/domains/server-directory/infrastructure/services/server-endpoint-compatibility.service.ts @@ -1,6 +1,6 @@ import { Injectable, inject } from '@angular/core'; -import { ElectronBridgeService } from '../../../core/platform/electron/electron-bridge.service'; -import type { ServerVersionCompatibilityResult } from '../domain/server-directory.models'; +import { ElectronBridgeService } from '../../../../core/platform/electron/electron-bridge.service'; +import type { ServerVersionCompatibilityResult } from '../../domain/models/server-directory.model'; @Injectable({ providedIn: 'root' }) export class ServerEndpointCompatibilityService { diff --git a/toju-app/src/app/domains/server-directory/infrastructure/server-endpoint-health.service.ts b/toju-app/src/app/domains/server-directory/infrastructure/services/server-endpoint-health.service.ts similarity index 93% rename from toju-app/src/app/domains/server-directory/infrastructure/server-endpoint-health.service.ts rename to toju-app/src/app/domains/server-directory/infrastructure/services/server-endpoint-health.service.ts index e8b7f84..113c000 100644 --- a/toju-app/src/app/domains/server-directory/infrastructure/server-endpoint-health.service.ts +++ b/toju-app/src/app/domains/server-directory/infrastructure/services/server-endpoint-health.service.ts @@ -1,10 +1,10 @@ import { Injectable, inject } from '@angular/core'; -import { SERVER_HEALTH_CHECK_TIMEOUT_MS } from './server-directory.infrastructure.constants'; +import { SERVER_HEALTH_CHECK_TIMEOUT_MS } from '../constants/server-directory.infrastructure.constants'; import type { ServerEndpoint, ServerEndpointHealthResult, ServerHealthCheckPayload -} from '../domain/server-directory.models'; +} from '../../domain/models/server-directory.model'; import { ServerEndpointCompatibilityService } from './server-endpoint-compatibility.service'; @Injectable({ providedIn: 'root' }) diff --git a/toju-app/src/app/domains/server-directory/infrastructure/server-endpoint-storage.service.ts b/toju-app/src/app/domains/server-directory/infrastructure/services/server-endpoint-storage.service.ts similarity index 90% rename from toju-app/src/app/domains/server-directory/infrastructure/server-endpoint-storage.service.ts rename to toju-app/src/app/domains/server-directory/infrastructure/services/server-endpoint-storage.service.ts index e9a3048..7ec12fe 100644 --- a/toju-app/src/app/domains/server-directory/infrastructure/server-endpoint-storage.service.ts +++ b/toju-app/src/app/domains/server-directory/infrastructure/services/server-endpoint-storage.service.ts @@ -1,6 +1,6 @@ import { Injectable } from '@angular/core'; -import { REMOVED_DEFAULT_SERVER_KEYS_STORAGE_KEY, SERVER_ENDPOINTS_STORAGE_KEY } from './server-directory.infrastructure.constants'; -import type { ServerEndpoint } from '../domain/server-directory.models'; +import { REMOVED_DEFAULT_SERVER_KEYS_STORAGE_KEY, SERVER_ENDPOINTS_STORAGE_KEY } from '../constants/server-directory.infrastructure.constants'; +import type { ServerEndpoint } from '../../domain/models/server-directory.model'; @Injectable({ providedIn: 'root' }) export class ServerEndpointStorageService {