import type { BulkWriteResult } from 'mongodb';
import { Connection, FilterQuery, Types } from 'mongoose';
import * as factory from '../factory';
import { IDocTypeAsProduct } from './mongoose/schemas/product';
type IKeyOfProjection = keyof factory.product.IProduct | 'hasOfferCatalog.id';
/**
 * プロダクト検索条件
 */
type ISearchConditions4product = factory.product.ISearchConditions;
type IUnsetKey = keyof Pick<factory.product.IProduct, 'additionalProperty' | 'availableChannel' | 'hasOfferCatalog' | 'serviceOutput' | 'serviceType'>;
/**
 * プロダクトリポジトリ
 */
export declare class ProductRepo {
    private readonly productModel;
    constructor(connection: Connection);
    static CREATE_MONGO_CONDITIONS(params: ISearchConditions4product): FilterQuery<factory.product.IProduct>[];
    /**
     * プロダクトを検索する
     */
    projectFields(conditions: ISearchConditions4product, inclusion: IKeyOfProjection[]): Promise<(factory.product.IProduct & {
        id: string;
    })[]>;
    /**
     * カタログを検索する
     */
    aggregateHasOfferCatalog(params: {
        id: string;
        limit: number;
        page: number;
    }): Promise<{
        /**
         * カタログID
         */
        id: string;
    }[]>;
    deleteProductById(params: {
        id: string;
    }): Promise<void>;
    /**
     * プロダクトを保管する
     */
    saveProduct(params: {
        /**
         * idを指定すれば更新
         */
        id?: string;
        $set: factory.product.IProduct & {
            offers?: never;
        };
        $unset: {
            [key in IUnsetKey]?: 1;
        };
        /**
         * 指定プロジェクトの指定プロダクトタイプが存在しなければ作成する
         */
        createIfNotExist?: boolean;
    }): Promise<{
        id: string;
    }>;
    /**
     * プロダクトコードをキーにして冪等置換
     */
    upsertManyByProductId(params: {
        $set: factory.product.IProduct & {
            offers?: never;
        };
        $unset?: {
            [key in IUnsetKey]?: 1;
        };
    }[]): Promise<{
        bulkWriteResult: BulkWriteResult;
        modifiedProducts: {
            id: string;
        }[];
    } | void>;
    /**
     * プロダクトIDからavailableChannelを取得する
     */
    findAvailableChannel(params: {
        project: {
            id: string;
        };
        typeOf: factory.service.paymentService.PaymentServiceType.PaymentCard;
        id: string;
    }): Promise<factory.product.IAvailableChannel>;
    /**
     * 指定カタログの設定されたプロダクトを削除する
     */
    deleteByHasOfferCatalog(params: {
        project: {
            id: string;
        };
        hasOfferCatalog: {
            id: string;
        };
    }): Promise<import("mongodb").DeleteResult>;
    /**
     * プロジェクト指定で削除する
     */
    deleteByProject(params: {
        project: {
            id: string;
        };
    }): Promise<void>;
    getCursor(conditions: any, projection: any): import("mongoose").Cursor<import("mongoose").Document<unknown, {}, IDocTypeAsProduct & import("./mongoose/schemas/product").IDocTypeAsProductOffer> & IDocTypeAsProduct & import("./mongoose/schemas/product").IDocTypeAsProductOffer & {
        _id: Types.ObjectId;
    }, import("mongoose").QueryOptions<import("mongoose").Document<unknown, {}, IDocTypeAsProduct & import("./mongoose/schemas/product").IDocTypeAsProductOffer> & IDocTypeAsProduct & import("./mongoose/schemas/product").IDocTypeAsProductOffer & {
        _id: Types.ObjectId;
    }>>;
    unsetUnnecessaryFields(params: {
        filter: FilterQuery<factory.product.IProduct>;
        $unset: any;
    }): Promise<import("mongoose").UpdateWriteOpResult>;
    migrateHasOfferCatalogItemListElement(params: {
        id: string;
        hasOfferCatalog: {
            id: string;
        };
    }): Promise<void>;
}
export {};
