@chevre/domain
Version: 
Chevre Domain Library for Node.js
250 lines (249 loc) • 7.15 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.modelName = exports.indexes = void 0;
exports.createSchema = createSchema;
const mongoose_1 = require("mongoose");
const writeConcern_1 = require("../writeConcern");
const factory = require("../../../factory");
const settings_1 = require("../../../settings");
const modelName = 'Transaction';
exports.modelName = modelName;
const schemaDefinition = {
    project: mongoose_1.SchemaTypes.Mixed,
    status: String,
    typeOf: String,
    agent: mongoose_1.SchemaTypes.Mixed,
    recipient: mongoose_1.SchemaTypes.Mixed,
    seller: mongoose_1.SchemaTypes.Mixed,
    error: mongoose_1.SchemaTypes.Mixed,
    result: mongoose_1.SchemaTypes.Mixed,
    object: mongoose_1.SchemaTypes.Mixed,
    expires: Date,
    startDate: Date,
    endDate: Date,
    tasksExportAction: mongoose_1.SchemaTypes.Mixed,
    // tasksExportedAt: Date, // discontinue(2024-06-19~)
    // tasksExportationStatus: String, // discontinue(2024-06-19~)
    potentialActions: mongoose_1.SchemaTypes.Mixed,
    instrument: mongoose_1.SchemaTypes.Mixed
};
const schemaOptions = {
    autoIndex: settings_1.MONGO_AUTO_INDEX,
    autoCreate: false,
    collection: 'transactions',
    id: true,
    read: 'primary',
    writeConcern: writeConcern_1.writeConcern,
    strict: true,
    strictQuery: false,
    timestamps: false,
    versionKey: false,
    toJSON: {
        getters: false,
        virtuals: false,
        minimize: false,
        versionKey: false
    },
    toObject: {
        getters: false,
        virtuals: true,
        minimize: false,
        versionKey: false
    }
};
const indexes = [
    [
        { 'project.id': 1, startDate: -1 },
        { name: 'searchByProjectId-v20220721' }
    ],
    [
        { typeOf: 1, startDate: -1 },
        { name: 'searchByTypeOfAndStartDate' }
    ],
    [
        { status: 1, startDate: -1 },
        { name: 'searchByStatusAndStartDate' }
    ],
    [
        { startDate: -1 },
        { name: 'searchByStartDateDescending' }
    ],
    [
        { endDate: 1, startDate: -1 },
        {
            name: 'searchByEndDateAndStartDate',
            partialFilterExpression: {
                endDate: { $exists: true }
            }
        }
    ],
    [
        { expires: 1, startDate: -1 },
        { name: 'searchByExpiresAndStartDate' }
    ],
    [
        { 'result.order.confirmationNumber': 1, startDate: -1 },
        {
            name: 'searchByResultOrderConfirmationNumber',
            partialFilterExpression: {
                'result.order.confirmationNumber': { $exists: true }
            }
        }
    ],
    [
        { 'result.order.orderNumber': 1, startDate: -1 },
        {
            name: 'searchByResultOrderNumberAndStartDate',
            partialFilterExpression: {
                'result.order.orderNumber': { $exists: true }
            }
        }
    ],
    [
        { 'object.confirmationNumber': 1, startDate: -1 },
        {
            name: 'searchByObjectConfirmationNumber',
            partialFilterExpression: {
                'object.confirmationNumber': { $exists: true }
            }
        }
    ],
    [
        { 'object.orderNumber': 1, startDate: -1 },
        {
            name: 'searchByObjectOrderNumber',
            partialFilterExpression: {
                'object.orderNumber': { $exists: true }
            }
        }
    ],
    [
        { 'object.order.orderNumber': 1, startDate: -1 },
        {
            name: 'searchByObjectOrderNumberAndStartDate',
            partialFilterExpression: {
                'object.order.orderNumber': { $exists: true }
            }
        }
    ],
    [
        // 結果の注文番号はユニークなはず
        {
            typeOf: 1,
            'result.order.orderNumber': 1
        },
        {
            name: 'searchPlaceOrderByOrderNumber',
            unique: true,
            partialFilterExpression: {
                'result.order.orderNumber': { $exists: true }
            }
        }
    ],
    [
        // ひとつの注文取引に対する確定返品取引はユニークなはず
        { 'object.order.orderNumber': 1 },
        {
            name: 'object.order.orderNumber_1',
            unique: true,
            partialFilterExpression: {
                typeOf: factory.transactionType.ReturnOrder, // 返品取引
                status: factory.transactionStatusType.Confirmed, // 確定ステータス
                'object.order.orderNumber': { $exists: true }
            }
        }
    ],
    [
        { 'agent.typeOf': 1, startDate: -1 },
        {
            name: 'searchByAgentTypeOfAndStartDate',
            partialFilterExpression: {
                'agent.typeOf': { $exists: true }
            }
        }
    ],
    [
        { 'agent.id': 1, startDate: -1 },
        {
            name: 'searchByAgentIdAndStartDate',
            partialFilterExpression: {
                'agent.id': { $exists: true }
            }
        }
    ],
    [
        { 'agent.identifier': 1, startDate: -1 },
        {
            name: 'searchByAgentIdentifierAndStartDate',
            partialFilterExpression: {
                'agent.identifier': { $exists: true }
            }
        }
    ],
    [
        { 'seller.id': 1, startDate: -1 },
        {
            name: 'searchBySellerIdAndStartDate',
            partialFilterExpression: {
                'seller.id': { $exists: true }
            }
        }
    ],
    [
        { status: 1, expires: 1 },
        { name: 'makeExpired' }
    ],
    [
        { status: 1, 'tasksExportAction.actionStatus': 1, endDate: 1 },
        {
            name: 'exportTasksIfExists',
            partialFilterExpression: {
                'tasksExportAction.actionStatus': { $exists: true },
                endDate: { $exists: true }
            }
        }
    ],
    [
        { 'tasksExportAction.actionStatus': 1, 'tasksExportAction.startDate': 1 },
        {
            name: 'reExportTasks',
            partialFilterExpression: {
                'tasksExportAction.startDate': { $exists: true }
            }
        }
    ],
    [
        { 'tasksExportAction.actionStatus': 1, startDate: -1 },
        {
            name: 'searchByTasksExportActionActionStatus',
            partialFilterExpression: {
                'tasksExportAction.actionStatus': { $exists: true }
            }
        }
    ],
    [
        { 'tasksExportAction.startDate': 1, startDate: -1 },
        {
            name: 'searchByTasksExportActionActionStartDate',
            partialFilterExpression: {
                'tasksExportAction.startDate': { $exists: true }
            }
        }
    ]
];
exports.indexes = indexes;
/**
 * 取引スキーマ
 */
let schema;
function createSchema() {
    if (schema === undefined) {
        schema = new mongoose_1.Schema(schemaDefinition, schemaOptions);
        if (settings_1.MONGO_AUTO_INDEX) {
            indexes.forEach((indexParams) => {
                schema === null || schema === void 0 ? void 0 : schema.index(...indexParams);
            });
        }
    }
    return schema;
}