This commit unifies executable ID structure across categories and scripts, paving the way for more complex ID solutions for #262. It also refactors related code to adapt to the changes. Key changes: - Change numeric IDs to string IDs for categories - Use named types for string IDs to improve code clarity - Add unit tests to verify ID uniqueness Other supporting changes: - Separate concerns in entities for data access and executables by using separate abstractions (`Identifiable` and `RepositoryEntity`) - Simplify usage and construction of entities. - Remove `BaseEntity` for simplicity. - Move creation of categories/scripts to domain layer - Refactor CategoryCollection for better validation logic isolation - Rename some categories to keep the names (used as pseudo-IDs) unique on Windows.
52 lines
1.9 KiB
TypeScript
52 lines
1.9 KiB
TypeScript
import type { ICategoryCollection } from '@/domain/Collection/ICategoryCollection';
|
|
import { OperatingSystem } from '@/domain/OperatingSystem';
|
|
import { AdaptiveFilterContext } from './Filter/AdaptiveFilterContext';
|
|
import { ApplicationCode } from './Code/ApplicationCode';
|
|
import { UserSelectionFacade } from './Selection/UserSelectionFacade';
|
|
import type { FilterContext } from './Filter/FilterContext';
|
|
import type { UserSelection } from './Selection/UserSelection';
|
|
import type { ICategoryCollectionState } from './ICategoryCollectionState';
|
|
import type { IApplicationCode } from './Code/IApplicationCode';
|
|
|
|
export class CategoryCollectionState implements ICategoryCollectionState {
|
|
public readonly os: OperatingSystem;
|
|
|
|
public readonly code: IApplicationCode;
|
|
|
|
public readonly selection: UserSelection;
|
|
|
|
public readonly filter: FilterContext;
|
|
|
|
public constructor(
|
|
public readonly collection: ICategoryCollection,
|
|
selectionFactory = DefaultSelectionFactory,
|
|
codeFactory = DefaultCodeFactory,
|
|
filterFactory = DefaultFilterFactory,
|
|
) {
|
|
this.selection = selectionFactory(collection, []);
|
|
this.code = codeFactory(this.selection.scripts, collection.scripting);
|
|
this.filter = filterFactory(collection);
|
|
this.os = collection.os;
|
|
}
|
|
}
|
|
|
|
export type CodeFactory = (
|
|
...params: ConstructorParameters<typeof ApplicationCode>
|
|
) => IApplicationCode;
|
|
|
|
const DefaultCodeFactory: CodeFactory = (...params) => new ApplicationCode(...params);
|
|
|
|
export type SelectionFactory = (
|
|
...params: ConstructorParameters<typeof UserSelectionFacade>
|
|
) => UserSelection;
|
|
|
|
const DefaultSelectionFactory: SelectionFactory = (
|
|
...params
|
|
) => new UserSelectionFacade(...params);
|
|
|
|
export type FilterFactory = (
|
|
...params: ConstructorParameters<typeof AdaptiveFilterContext>
|
|
) => FilterContext;
|
|
|
|
const DefaultFilterFactory: FilterFactory = (...params) => new AdaptiveFilterContext(...params);
|