import { Ref, Nullable } from './common'; import { HasObjectId } from './has-object-id'; import { IPageOperationProcessData } from './page-operation'; import { IRevision, HasRevisionShortbody } from './revision'; import { SubscriptionStatusType } from './subscription'; import { ITag } from './tag'; import { IUser } from './user'; export interface IPage { path: string, status: string, revision: Ref, tags: Ref[], creator: any, createdAt: Date, updatedAt: Date, seenUsers: Ref[], parent: Ref | null, descendantCount: number, isEmpty: boolean, grant: PageGrant, grantedUsers: Ref[], grantedGroup: Ref, lastUpdateUser: Ref, liker: Ref[], commentCount: number slackChannels: string, pageIdOnHackmd: string, revisionHackmdSynced: Ref, hasDraftOnHackmd: boolean, deleteUser: Ref, deletedAt: Date, } export const PageGrant = { GRANT_PUBLIC: 1, GRANT_RESTRICTED: 2, GRANT_SPECIFIED: 3, // DEPRECATED GRANT_OWNER: 4, GRANT_USER_GROUP: 5, }; export type PageGrant = typeof PageGrant[keyof typeof PageGrant]; export type IPageHasId = IPage & HasObjectId; export type IPageForItem = Partial; export type IPageInfo = { isV5Compatible: boolean, isEmpty: boolean, isMovable: boolean, isDeletable: boolean, isAbleToDeleteCompletely: boolean, isRevertible: boolean, contentAge?: number, } export type IPageInfoForEntity = IPageInfo & { bookmarkCount?: number, sumOfLikers?: number, likerIds?: string[], sumOfSeenUsers?: number, seenUserIds?: string[], } export type IPageInfoForOperation = IPageInfoForEntity & { isBookmarked?: boolean, isLiked?: boolean, subscriptionStatus?: SubscriptionStatusType, } export type IPageInfoForListing = IPageInfoForEntity & HasRevisionShortbody; export type IPageInfoAll = IPageInfo | IPageInfoForEntity | IPageInfoForOperation | IPageInfoForListing; // eslint-disable-next-line @typescript-eslint/no-explicit-any export const isIPageInfoForEntity = (pageInfo: any | undefined): pageInfo is IPageInfoForEntity => { return pageInfo != null; }; // eslint-disable-next-line @typescript-eslint/no-explicit-any export const isIPageInfoForOperation = (pageInfo: any | undefined): pageInfo is IPageInfoForOperation => { return pageInfo != null && isIPageInfoForEntity(pageInfo) && ('isBookmarked' in pageInfo || 'isLiked' in pageInfo || 'subscriptionStatus' in pageInfo); }; // eslint-disable-next-line @typescript-eslint/no-explicit-any export const isIPageInfoForListing = (pageInfo: any | undefined): pageInfo is IPageInfoForListing => { return pageInfo != null && isIPageInfoForEntity(pageInfo) && 'revisionShortBody' in pageInfo; }; // export type IPageInfoTypeResolver = // T extends HasRevisionShortbody ? IPageInfoForListing : // T extends { isBookmarked?: boolean } | { isLiked?: boolean } | { subscriptionStatus?: SubscriptionStatusType } ? IPageInfoForOperation : // T extends { bookmarkCount: number } ? IPageInfoForEntity : // T extends { isEmpty: number } ? IPageInfo : // T; /** * Union Distribution * @param pageInfo * @returns */ // export const resolvePageInfo = (pageInfo: T | undefined): IPageInfoTypeResolver => { // return >pageInfo; // }; export type IDataWithMeta = { data: D, meta?: M, } export type IPageWithMeta = IDataWithMeta; export type IPageToDeleteWithMeta = IDataWithMeta; export type IPageToRenameWithMeta = IPageToDeleteWithMeta; export type IPageGrantData = { grant: number, grantedGroup?: { id: string, name: string } } export type IDeleteSinglePageApiv1Result = { ok: boolean path: string, isRecursively: Nullable, isCompletely: Nullable, }; export type IDeleteManyPageApiv3Result = { paths: string[], isRecursively: Nullable, isCompletely: Nullable, };