# Copyright (C) 2019-present MongoDB, Inc.
#
# This program is free software: you can redistribute it and/or modify
# it under the terms of the Server Side Public License, version 1,
# as published by MongoDB, Inc.
#
# This program is distributed in the hope that it will be useful,
# but WITHOUT ANY WARRANTY; without even the implied warranty of
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
# Server Side Public License for more details.
#
# You should have received a copy of the Server Side Public License
# along with this program. If not, see
# <http://www.mongodb.com/licensing/server-side-public-license>.
#
# As a special exception, the copyright holders give permission to link the
# code of portions of this program with the OpenSSL library under certain
# conditions as described in each individual source file and distribute
# linked combinations including the program with the OpenSSL library. You
# must comply with the Server Side Public License in all respects for
# all of the code used other than as permitted herein. If you modify file(s)
# with this exception, you may extend this exception to your version of the
# file(s), but you are not obligated to do so. If you do not wish to do so,
# delete this exception statement from your version. If you delete this
# exception statement from all source files in the program, then also delete
# it in the license file.
#

global:
    cpp_namespace: "mongo"

imports:
    - "mongo/db/auth/action_type.idl"
    - "mongo/db/catalog/commit_quorum.idl"
    - "mongo/idl/basic_types.idl"

structs:
    CreateIndexesReply:
        description: "Reply to 'createIndexes' command"
        strict: true
        fields:
            numIndexesBefore:
                description: 'Index count before create'
                type: int
                optional: true
            numIndexesAfter:
                description: 'Index count after create'
                type: int
                optional: true
            createdCollectionAutomatically:
                description: >-
                    Whether or not this createIndexes command resulted
                    in a newly created collection.
                type: bool
                optional: true
            commitQuorum:
                description: 'Commit Quorum options used'
                type: CommitQuorum
                optional: true
            note:
                description: 'Optional warning/error related to createIndex'
                type: string
                optional: true

    # A built index appears with these fields, which must be the same as ListIndexesReplyItem's
    # fields in list_indexes.idl.
    NewIndexSpec:
        description: "A type representing a spec for a new index"
        strict: true
        fields:
            v:
                description: 'Index spec version'
                type: safeInt
                optional: true
            key:
                description: 'Key to index on'
                type: object_owned
            name:
                description: 'Descriptive name for the index'
                type: string
            ns:
                # MongoDB 4.2 and older generate this field, see SERVER-41696.
                type: string
                ignore: true
            background:
                type: safeBool
                optional: true
                unstable: true
            unique:
                type: safeBool
                optional: true
            hidden:
                type: safeBool
                optional: true
            partialFilterExpression:
                type: object_owned
                optional: true
            sparse:
                type: safeBool
                optional: true
                unstable: true
            expireAfterSeconds:
                type: safeInt
                optional: true
            storageEngine:
                type: object_owned
                optional: true
                unstable: true
            weights:
                type:
                    variant: [string, object_owned]
                optional: true
            default_language:
                type: string
                optional: true
            language_override:
                type: string
                optional: true
            textIndexVersion:
                type: safeInt
                optional: true
            2dsphereIndexVersion:
                type: safeInt
                optional: true
            bits:
                type: safeInt
                optional: true
            min:
                type: safeDouble
                optional: true
            max:
                type: safeDouble
                optional: true
            bucketSize:
                type: safeDouble
                optional: true
                unstable: true
            collation:
                type: object_owned
                optional: true
            wildcardProjection:
                type: object_owned
                optional: true
            coarsestIndexedLevel:
                type: safeInt
                optional: true
            finestIndexedLevel:
                type: safeInt
                optional: true
            dropDups:
                type: safeBool
                optional: true
                unstable: true

commands:
    createIndexes:
        description: "Command for creating indexes on a collection"
        command_name: createIndexes
        namespace: concatenate_with_db
        cpp_name: CreateIndexesCommand
        api_version: "1"
        access_check:
            simple:
                privilege:
                    resource_pattern: exact_namespace
                    action_type: createIndex
        reply_type: CreateIndexesReply
        strict: true
        fields:
            v:
                description: 'Index schema version'
                type: safeInt
                default: 2
            indexes:
                description: 'Indexes to be created'
                # array<NewIndexSpec> but respect ignoreUnknownIndexOptions
                type: array<object>
            ignoreUnknownIndexOptions:
                description: 'Ignore unknown options in index spec'
                type: safeBool
                default: false
            commitQuorum:
                description: 'Commit Quorum options'
                type: CommitQuorum
                optional: true
            isTimeseriesNamespace:
                description: "This flag is set to true when the command was originally sent to
                              mongos on the time-series view, but got rewritten to target
                              time-series buckets namespace before being sent to shards."
                type: bool
                optional: true
