//
// SPDX-License-Identifier: AGPL-3.0
-import LinkService from "../link-service/link-service";
-import GroupsService, { GroupContentsResource } from "../groups-service/groups-service";
-import { LinkResource, LinkClass } from "../../models/link";
-import FilterBuilder from "../../common/api/filter-builder";
-import { ListArguments, ListResults } from "../../common/api/common-resource-service";
-import OrderBuilder from "../../common/api/order-builder";
+import { LinkService } from "../link-service/link-service";
+import { GroupsService, GroupContentsResource } from "../groups-service/groups-service";
+import { LinkClass } from "~/models/link";
+import { FilterBuilder, joinFilters } from "~/services/api/filter-builder";
+import { ListResults } from '~/services/common-service/common-service';
-export interface FavoriteListArguments extends ListArguments {
- filters?: FilterBuilder<LinkResource>;
- order?: OrderBuilder<LinkResource>;
+export interface FavoriteListArguments {
+ limit?: number;
+ offset?: number;
+ filters?: string;
+ linkOrder?: string;
+ contentOrder?: string;
}
-export default class FavoriteService {
+
+export class FavoriteService {
constructor(
private linkService: LinkService,
- private groupsService: GroupsService
- ) { }
+ private groupsService: GroupsService,
+ ) {}
- create(data: { userUuid: string; resourceUuid: string; }) {
+ create(data: { userUuid: string; resource: { uuid: string; name: string } }) {
return this.linkService.create({
ownerUuid: data.userUuid,
tailUuid: data.userUuid,
- headUuid: data.resourceUuid,
+ headUuid: data.resource.uuid,
linkClass: LinkClass.STAR,
- name: data.resourceUuid
+ name: data.resource.name
});
}
delete(data: { userUuid: string; resourceUuid: string; }) {
return this.linkService
.list({
- filters: FilterBuilder
- .create<LinkResource>()
- .addEqual('tailUuid', data.userUuid)
- .addEqual('headUuid', data.resourceUuid)
- .addEqual('linkClass', LinkClass.STAR)
+ filters: new FilterBuilder()
+ .addEqual('tail_uuid', data.userUuid)
+ .addEqual('head_uuid', data.resourceUuid)
+ .addEqual('link_class', LinkClass.STAR)
+ .getFilters()
})
.then(results => Promise.all(
results.items.map(item => this.linkService.delete(item.uuid))));
}
- list(userUuid: string, args: FavoriteListArguments = {}): Promise<ListResults<GroupContentsResource>> {
- const listFilter = FilterBuilder
- .create<LinkResource>()
- .addEqual('tailUuid', userUuid)
- .addEqual('linkClass', LinkClass.STAR);
+ list(userUuid: string, { filters, limit, offset, linkOrder, contentOrder }: FavoriteListArguments = {}): Promise<ListResults<GroupContentsResource>> {
+ const listFilters = new FilterBuilder()
+ .addEqual('tail_uuid', userUuid)
+ .addEqual('link_class', LinkClass.STAR)
+ .getFilters();
return this.linkService
.list({
- ...args,
- filters: args.filters ? args.filters.concat(listFilter) : listFilter
+ filters: joinFilters(filters, listFilters),
+ limit,
+ offset,
+ order: linkOrder
})
.then(results => {
const uuids = results.items.map(item => item.headUuid);
return this.groupsService.contents(userUuid, {
- limit: args.limit,
- offset: args.offset,
- filters: FilterBuilder.create<GroupContentsResource>().addIn('uuid', uuids),
+ limit,
+ offset,
+ order: contentOrder,
+ filters: new FilterBuilder().addIn('uuid', uuids).getFilters(),
recursive: true
});
});
}
+ checkPresenceInFavorites(userUuid: string, resourceUuids: string[]): Promise<Record<string, boolean>> {
+ return this.linkService
+ .list({
+ filters: new FilterBuilder()
+ .addIn("head_uuid", resourceUuids)
+ .addEqual("tail_uuid", userUuid)
+ .addEqual("link_class", LinkClass.STAR)
+ .getFilters()
+ })
+ .then(({ items }) => resourceUuids.reduce((results, uuid) => {
+ const isFavorite = items.some(item => item.headUuid === uuid);
+ return { ...results, [uuid]: isFavorite };
+ }, {}));
+ }
-}
\ No newline at end of file
+}