55 lines
1.6 KiB
TypeScript
55 lines
1.6 KiB
TypeScript
import "reflect-metadata";
|
|
import { injectable } from "inversify";
|
|
|
|
import type { IArticlesRepository } from "../../application/repositories/articles-repository.interface";
|
|
import type { Article } from "../../entities/article";
|
|
|
|
@injectable()
|
|
export class MockArticlesRepository implements IArticlesRepository {
|
|
private _articles: Article[] = [];
|
|
|
|
async getArticle(id: string): Promise<Article | undefined> {
|
|
return this._articles.find((a) => a.id === id);
|
|
}
|
|
|
|
async getArticleBySlug(slug: string): Promise<Article | undefined> {
|
|
return this._articles.find((a) => a.slug === slug);
|
|
}
|
|
|
|
async getArticles(options?: {
|
|
status?: string;
|
|
authorId?: string;
|
|
limit?: number;
|
|
offset?: number;
|
|
}): Promise<Article[]> {
|
|
let result = [...this._articles];
|
|
if (options?.status) {
|
|
result = result.filter((a) => a.status === options.status);
|
|
}
|
|
if (options?.authorId) {
|
|
result = result.filter((a) => a.authorId === options.authorId);
|
|
}
|
|
const offset = options?.offset ?? 0;
|
|
const limit = options?.limit ?? 50;
|
|
return result.slice(offset, offset + limit);
|
|
}
|
|
|
|
async createArticle(input: Article): Promise<Article> {
|
|
this._articles.push(input);
|
|
return input;
|
|
}
|
|
|
|
async updateArticle(
|
|
id: string,
|
|
input: Partial<Article>,
|
|
): Promise<Article | undefined> {
|
|
const index = this._articles.findIndex((a) => a.id === id);
|
|
if (index === -1) return undefined;
|
|
const current = this._articles[index];
|
|
if (!current) return undefined;
|
|
const updated: Article = { ...current, ...input, id: current.id };
|
|
this._articles[index] = updated;
|
|
return updated;
|
|
}
|
|
}
|