feat: pinned tickets, at hand on the home page and in search
Each person pins up to 20 tickets from the ticket's page («Fijar»). They
show as a strip under the projects on the home page and in the search
palette before typing. Private and without history, like the views of
«my work» (Mongo `pinned_issues`); tickets in the trash or out of reach
are left out, and when the list is full the unreadable ones are dropped
first.
API: GET /api/me/pins, PUT/DELETE /api/issues/{issue}/pin; GraphQL
myPins, pinIssue, unpinIssue and Issue.pinned.
Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
31
libs/api/tracker/application/src/lib/pins.service.ts
Normal file
31
libs/api/tracker/application/src/lib/pins.service.ts
Normal file
@@ -0,0 +1,31 @@
|
||||
import { CommandRunner } from '@task-stream/api/shared/application';
|
||||
import { Injectable } from '@nestjs/common';
|
||||
import { QueryBus } from '@nestjs/cqrs';
|
||||
import { IssueReadModel } from '@task-stream/api/tracker/domain';
|
||||
import {
|
||||
GetMyPinsQuery,
|
||||
IsIssuePinnedQuery,
|
||||
PinIssueCommand,
|
||||
} from './saved-filters/pins';
|
||||
|
||||
/** Pinned tickets: the few someone keeps at hand, across projects. */
|
||||
@Injectable()
|
||||
export class PinsService {
|
||||
constructor(
|
||||
private readonly commands: CommandRunner,
|
||||
private readonly queryBus: QueryBus,
|
||||
) {}
|
||||
|
||||
/** Mine, most recently pinned first. */
|
||||
mine(ownerId: string): Promise<IssueReadModel[]> {
|
||||
return this.queryBus.execute(new GetMyPinsQuery(ownerId));
|
||||
}
|
||||
|
||||
isPinned(ownerId: string, issueId: string): Promise<boolean> {
|
||||
return this.queryBus.execute(new IsIssuePinnedQuery(ownerId, issueId));
|
||||
}
|
||||
|
||||
pin(ownerId: string, issueId: string, pinned: boolean): Promise<void> {
|
||||
return this.commands.execute(new PinIssueCommand(ownerId, issueId, pinned));
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user