interface PermissionInterface {
    id?: number;
    code: string;
    userId: number;
    categoryId: number | null;
    lastUpdatedBy?: number | null;
    isRevision?: Boolean;
    adminOnly?: boolean;
    revisionId?: number;
    status: number;
    sortOrder?: number;
    permissionContent?: PermissionContentInterface,
    permissionContents?: PermissionContentInterface[];
}

interface PermissionContentInterface {
    id?: number;
    permissionId?: number;
    languageId: number;
    name: string;
    description: Text;
    descriptionText: Text;
}

interface PermissionRequest {
    name: string;
    categoryCode: string | null;
    description?: Text | null;
    descriptionText?: Text | null;
    code: string;
    status: number | null;
}

interface PermissionObject {
    code: string;
    status: number | null;
    categoryId: number | null;
    lastUpdatedBy?: number | null;
}

interface PermissionContentObject {
    id?: number;
    permissionId?: number;
    name: string;
    description?: Text | null;
    descriptionText?: Text | null;
    languageId?: number;
}

interface PermissionDataObject {
    id?: number;
    code?: string | null;
    categoryId: number | null;
    userId: number | null;
    lastUpdatedBy?: number | null;
    permissionContents?: permissionContentObject[];
    permissionContent?: permissionContentObject
}

interface PermissionCategory {
    id: number;
    code: string;
    name: string;
}

interface PermissionObjectInteface {
    id: number;
    code: string;
    status: number;
    permissionCategory: permissionCategory;
    author: UserPublicObjectInterface | null;
    lastUpdatedBy: UserPublicObjectInterface | null,
    name: string;
    description?: Text | null;
    descriptionText?: Text | null;
    createdAt: Date,
    updatedAt: Date
}

interface PermissionObjectSummaryInteface {
    id: number;
    code: string;
    status: number;
    name: string;
    description?: Text | null;
    descriptionText?: Text | null;
    createdAt: Date,
    updatedAt: Date
}

interface PermissionTree {
    category: categoryObjectInteface,
    permissions: permissionObjectInteface[] | permissionObjectSummaryInteface[]
    childTree: PermissionTree[] | []
}

interface PermissionPaginatedData {
    count: number;
    rows: permissionObjectSummaryInteface[] | []
}

interface PermissionPaginatedList {
    page: number;
    perPage: number;
    totalRecords: number;
    totalPages?: number;
    data: permissionObjectSummaryInteface[] | [];
}

interface PermissionListRequestObject {
    page: number;
    perPage: number;
    searchText: string | null;
    sortBy: string;
    sortDirection: string;
    status: number | null;
    categoryCode: string | null;
}

interface PermissionListAllRequestObject {
    searchText: string | null;
    sortBy: string;
    sortDirection: string;
    status: number | null
    categoryCode: string | null;
}

interface PermissionIdentifierObject {
    id: number;
}

interface PermissionCategoryIdentifierObject {
    categoryId: number;
}

interface PermissionCategoryCodeIdentifierObject {
    categoryCode: string | null;
}

interface PermissionStringIdentifierObject {
    code: string;
}

interface PermissionSortRequest {
    before: number | null;
    after: number | null;
}

interface PermissionStatusObject {
    status: number;
}

interface DaoOptions {
    transaction?: import("sequelize").Transaction;
}

interface PermissionCreateServiceInput {
    name: string;
    categoryCode: string | null;
    description?: Text | null;
    code: string;
    status: number | null;
}

interface PermissionUpdateServiceInput {
    id: number;
    name: string;
    categoryCode: string | null;
    description?: Text | null;
    code: string;
    status: number | null;
}

interface PermissionDeleteServiceInput {
    id: number;
}

interface PermissionGetByIdServiceInput {
    id: number;
    paranoid?: boolean;
}

interface PermissionGetByCodeServiceInput {
    code: string;
    paranoid?: boolean;
}

interface PermissionGetPermissionsServiceInput {
    listRequest: PermissionListRequestObject;
}

interface PermissionGetAllPermissionsServiceInput {
    listRequest: PermissionListAllRequestObject;
}

interface PermissionGetPermissionsRevisionsServiceInput {
    id: number;
    listRequest: PermissionListRequestObject;
}

interface PermissionRestoreRevisionServiceInput {
    id: number;
}

interface PermissionSetSortOrderServiceInput {
    id: number;
    before: number | null;
    after: number | null;
}

interface PermissionUpdateStatusServiceInput {
    id: number;
    status: number;
}

interface PermissionGetCategoryIdServiceInput {
    categoryCode: string;
}

interface PermissionVerifyPermissionServiceInput {
    ids: number[] | null;
}

interface PermissionGetDaoInput {
    id?: number | null;
    code?: string | null;
    paranoid?: boolean;
}

interface PermissionGetPermissionsDaoInput {
    ids: number[] | null;
    fullObject: boolean;
    paranoid?: boolean;
}

interface PermissionGetByIdDaoInput {
    id: number;
    paranoid?: boolean;
}

interface PermissionGetByCodeDaoInput {
    code: string;
    paranoid?: boolean;
}

interface PermissionDoExistsByCodeDaoInput {
    code: string;
    excludeId?: number | null;
    includeRevision?: boolean;
}

interface PermissionDoExistsByIdDaoInput {
    id: number;
    includeRevision?: boolean;
}

interface PermissionCreateDaoInput {
    permissionObj: PermissionObject;
    permissionContentObj: PermissionContentObject;
    languages: LanguageInfo;
}

interface PermissionUpdateDaoInput {
    id: number;
    permissionObj: PermissionObject;
    permissionContentObj: PermissionContentObject;
    languages: LanguageInfo;
}

interface PermissionDeleteDaoInput {
    id: number;
}

interface PermissionSetSortOrderDaoInput {
    id: number;
    before?: number | null;
    after?: number | null;
}

interface PermissionGetPermissionListDaoInput {
    categoryId: number | null;
    listRequest: PermissionListRequestObject;
}

interface PermissionGetAllPermissionsDaoInput {
    categoryId: number | null;
    listRequest: PermissionListAllRequestObject;
}

interface PermissionGetPermissionRevisionListDaoInput {
    id: number;
    listRequest: PermissionListRequestObject;
}

interface PermissionRestoreRevisionDaoInput {
    id: number;
}

interface PermissionUpdateStatusDaoInput {
    id: number;
    status: number;
}

interface PermissionVerifyPermissionsDaoInput {
    ids: number[] | null;
}
