CACHE_BUILDER_CONSOLIDATION.md 4.4 KB

Cache Builder Consolidation Complete

Summary

Successfully consolidated the video category/tag cache builder to use only the core version. Eliminated the duplicate app-level builder and wired the core builder into the box-mgnt-api cache warmup flow.

Changes Made

1. ✅ Removed Duplicate App-Level Builder

Deleted file:

  • apps/box-mgnt-api/src/cache/video-category-cache.builder.ts

Verification:

  • App-level cache directory now contains only: adpool-warmup.service.ts, video-category-warmup.service.ts, video-list-cache.builder.ts, video-list-warmup.service.ts

2. ✅ Established Clean Core Exports

Created index files for proper module organization:

libs/core/src/cache/video/index.ts

export {
  VideoCategoryCacheBuilder,
  VideoCategoryPayload,
  VideoTagPayload,
} from './video-category-cache.builder';
export { VideoCategoryWarmupService } from './video-category-warmup.service';

libs/core/src/cache/index.ts (top-level cache exports)

export * from './video';
export * from './category';
export * from './tag';
export * from './channel';

libs/core/src/cache/{category,tag,channel}/index.ts (supporting modules)

  • Each now exports its builder, cache service, and warmup service

3. ✅ Wired Core Builder into Box-MGNT-API Warmup

Updated: apps/box-mgnt-api/src/cache/video-category-warmup.service.ts

import { VideoCategoryCacheBuilder } from '@box/core/cache/video';

@Injectable()
export class VideoCategoryWarmupService implements OnModuleInit {
  constructor(private readonly builder: VideoCategoryCacheBuilder) {}

  async onModuleInit(): Promise<void> {
    await this.builder.buildAll();
    // ...
  }
}

Updated: apps/box-mgnt-api/src/app.module.ts

  • Removed: import { VideoCategoryCacheBuilder } from './cache/video-category-cache.builder';
  • Removed: VideoCategoryCacheBuilder from providers array
  • Kept: VideoCategoryWarmupService which now imports from core

4. ✅ Verification

Test Suite Results:

  • ✅ Typecheck: PASS (0 errors)
  • ✅ Lint: PASS (0 warnings)
  • ✅ Build (box-mgnt-api): PASS

Architecture Verification:

  • ✅ Core builder still extends BaseCacheBuilder
  • ✅ Core builder is exported via @box/core/cache/video
  • ✅ App-level warmup service imports from core
  • ✅ No duplicate builders remain
  • ✅ Dependency injection chain intact

Import Paths

Now use these clean import paths across the project:

// Video category/tag caching
import {
  VideoCategoryCacheBuilder,
  VideoCategoryPayload,
  VideoTagPayload,
} from '@box/core/cache/video';

// Top-level cache access (when needed)
import {} from /* any cache component */ '@box/core/cache';

Architecture

libs/core/src/cache/
├── cache-manager.module.ts          (exports all cache builders)
├── index.ts                         (barrel exports)
├── video/
│   ├── video-category-cache.builder.ts  (canonical)
│   ├── video-category-warmup.service.ts
│   └── index.ts                        (exports)
├── category/
│   ├── category-cache.builder.ts
│   ├── category-cache.service.ts
│   ├── category-warmup.service.ts
│   └── index.ts
├── tag/
│   ├── tag-cache.builder.ts
│   ├── tag-cache.service.ts
│   ├── tag-warmup.service.ts
│   └── index.ts
└── channel/
    ├── channel-cache.builder.ts
    ├── channel-cache.service.ts
    ├── channel-warmup.service.ts
    └── index.ts

apps/box-mgnt-api/src/cache/
├── adpool-warmup.service.ts         (local - not migrated)
├── video-category-warmup.service.ts (imports core builder)
├── video-list-cache.builder.ts      (local - app-specific)
└── video-list-warmup.service.ts     (local)

Benefits

  1. Single Source of Truth: One canonical VideoCategoryCacheBuilder in core
  2. Clean Imports: @box/core/cache/video path for video builders
  3. Reduced Duplication: Eliminated redundant code
  4. Better Maintainability: Changes to cache logic happen in one place
  5. Consistent Pattern: Follows existing cache builder pattern from channel, category, tag builders

Next Steps

If you need to create additional cache builders:

  1. Implement in libs/core/src/cache/{entity}/
  2. Export via index file
  3. Import in app-level warmup service
  4. No duplicate app-level builders needed