var __assign = (this && this.__assign) || function () {
    __assign = Object.assign || function(t) {
        for (var s, i = 1, n = arguments.length; i < n; i++) {
            s = arguments[i];
            for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
                t[p] = s[p];
        }
        return t;
    };
    return __assign.apply(this, arguments);
};
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
    function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
    return new (P || (P = Promise))(function (resolve, reject) {
        function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
        function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
        function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
        step((generator = generator.apply(thisArg, _arguments || [])).next());
    });
};
var __generator = (this && this.__generator) || function (thisArg, body) {
    var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g;
    return g = { next: verb(0), "throw": verb(1), "return": verb(2) }, typeof Symbol === "function" && (g[Symbol.iterator] = function() { return this; }), g;
    function verb(n) { return function (v) { return step([n, v]); }; }
    function step(op) {
        if (f) throw new TypeError("Generator is already executing.");
        while (_) try {
            if (f = 1, y && (t = op[0] & 2 ? y["return"] : op[0] ? y["throw"] || ((t = y["return"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;
            if (y = 0, t) op = [op[0] & 2, t.value];
            switch (op[0]) {
                case 0: case 1: t = op; break;
                case 4: _.label++; return { value: op[1], done: false };
                case 5: _.label++; y = op[1]; op = [0]; continue;
                case 7: op = _.ops.pop(); _.trys.pop(); continue;
                default:
                    if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }
                    if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }
                    if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }
                    if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }
                    if (t[2]) _.ops.pop();
                    _.trys.pop(); continue;
            }
            op = body.call(thisArg, _);
        } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }
        if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };
    }
};
(function (factory) {
    if (typeof module === "object" && typeof module.exports === "object") {
        var v = factory(require, exports);
        if (v !== undefined) module.exports = v;
    }
    else if (typeof define === "function" && define.amd) {
        define(["require", "exports", "./AclManagementClient", "./RolesManagementClient", "./AgreementManagementClient"], factory);
    }
})(function (require, exports) {
    "use strict";
    Object.defineProperty(exports, "__esModule", { value: true });
    exports.ApplicationsManagementClient = void 0;
    var AclManagementClient_1 = require("./AclManagementClient");
    var RolesManagementClient_1 = require("./RolesManagementClient");
    var AgreementManagementClient_1 = require("./AgreementManagementClient");
    /**
     * @class ApplicationsManagementClient 管理分组
     * @description 此模块用于管理 Authing 分组,可以进行分组的增删改查、分组添加/删除用户、分组添加/删除策略 等操作。
     *
     * @example
     *
     * 请使用以下方式使用该模块,而不要直接初始化该模块:
     * \`\`\`javascript
     * import { ManagementClient } from "authing-js-sdk"
     * const managementClient = new ManagementClient({
     *    userPoolId: "YOUR_USERPOOL_ID",
     *    secret: "YOUR_USERPOOL_SECRET",
     * })
     * managementClient.applications.list // 获取应用列表
     * managementClient.applications.findById // 通过 ID 获取应用详情
     * \`\`\`
     *
     * @name ApplicationsManagementClient
     */
    var ApplicationsManagementClient = /** @class */ (function () {
        function ApplicationsManagementClient(options, httpClient, graphqlClient, tokenProvider) {
            this.options = options;
            this.httpClient = httpClient;
            this.graphqlClient = graphqlClient;
            this.tokenProvider = tokenProvider;
            this.acl = new AclManagementClient_1.AclManagementClient(options, graphqlClient, httpClient, tokenProvider);
            this.roles = new RolesManagementClient_1.RolesManagementClient(options, graphqlClient, tokenProvider);
            this.agreements = new AgreementManagementClient_1.AgreementManagementClient(options, graphqlClient, httpClient, tokenProvider);
        }
        /**
         * @description 获取用户池应用列表
         *
         */
        ApplicationsManagementClient.prototype.list = function (params) {
            return __awaiter(this, void 0, void 0, function () {
                var _a, _b, page, _c, limit, data;
                return __generator(this, function (_d) {
                    switch (_d.label) {
                        case 0:
                            _a = params || {}, _b = _a.page, page = _b === void 0 ? 1 : _b, _c = _a.limit, limit = _c === void 0 ? 10 : _c;
                            return [4 /*yield*/, this.httpClient.request({
                                    url: this.options.host + "/api/v2/applications",
                                    method: 'GET',
                                    params: {
                                        page: page,
                                        limit: limit
                                    }
                                })];
                        case 1:
                            data = _d.sent();
                            return [2 /*return*/, data];
                    }
                });
            });
        };
        /**
         * 创建应用
         * @param options.name 应用名称
         * @param options.identifier 应用认证地址
         * @param options.redirectUris 应用回调链接
         * @param options.logo 应用 logo
         * @returns Promise<Application>
         */
        ApplicationsManagementClient.prototype.create = function (options) {
            return __awaiter(this, void 0, void 0, function () {
                var result;
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.httpClient.request({
                                method: 'POST',
                                url: this.options.host + "/api/v2/applications",
                                data: __assign({}, options)
                            })];
                        case 1:
                            result = _a.sent();
                            return [2 /*return*/, result];
                    }
                });
            });
        };
        /**
         * 删除应用
         * @param appId 应用 ID
         * @returns Promise<boolean>
         */
        ApplicationsManagementClient.prototype.delete = function (appId) {
            return __awaiter(this, void 0, void 0, function () {
                var error_1;
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            _a.trys.push([0, 2, , 3]);
                            return [4 /*yield*/, this.httpClient.request({
                                    method: 'DELETE',
                                    url: this.options.host + "/api/v2/applications/" + appId
                                })];
                        case 1:
                            _a.sent();
                            return [2 /*return*/, true];
                        case 2:
                            error_1 = _a.sent();
                            throw error_1;
                        case 3: return [2 /*return*/];
                    }
                });
            });
        };
        /**
         * @description 通过 ID 获取应用详情
         * @param id 应用 ID
         */
        ApplicationsManagementClient.prototype.findById = function (id) {
            return __awaiter(this, void 0, void 0, function () {
                var data;
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0:
                            if (!id) {
                                throw new Error('params id is required!');
                            }
                            return [4 /*yield*/, this.httpClient.request({
                                    url: this.options.host + "/api/v2/applications/" + id,
                                    method: 'GET'
                                })];
                        case 1:
                            data = _a.sent();
                            return [2 /*return*/, data];
                    }
                });
            });
        };
        ApplicationsManagementClient.prototype.listResources = function (appId, options) {
            return __awaiter(this, void 0, void 0, function () {
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.acl.getResources(__assign(__assign({}, options), { namespace: appId }))];
                        case 1: return [2 /*return*/, _a.sent()];
                    }
                });
            });
        };
        ApplicationsManagementClient.prototype.createResource = function (appId, options) {
            return __awaiter(this, void 0, void 0, function () {
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.acl.createResource(__assign(__assign({}, options), { namespace: appId }))];
                        case 1: return [2 /*return*/, _a.sent()];
                    }
                });
            });
        };
        ApplicationsManagementClient.prototype.updateResource = function (appId, options) {
            return __awaiter(this, void 0, void 0, function () {
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.acl.updateResource(options.code, __assign(__assign({}, options), { namespace: appId }))];
                        case 1: return [2 /*return*/, _a.sent()];
                    }
                });
            });
        };
        ApplicationsManagementClient.prototype.deleteResource = function (appId, code) {
            return __awaiter(this, void 0, void 0, function () {
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.acl.deleteResource(code, appId)];
                        case 1: return [2 /*return*/, _a.sent()];
                    }
                });
            });
        };
        /**
         * @description 获取应用访问控制策略
         * @param appId
         * @param options
         */
        ApplicationsManagementClient.prototype.getAccessPolicies = function (appId, options) {
            return __awaiter(this, void 0, void 0, function () {
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.acl.getApplicationAccessPolicies(__assign(__assign({}, options), { appId: appId }))];
                        case 1: return [2 /*return*/, _a.sent()];
                    }
                });
            });
        };
        /**
         * @description 启用针对某个用户、角色、分组、组织机构的应用访问控制策略
         * @param appId
         * @param options
         */
        ApplicationsManagementClient.prototype.enableAccessPolicy = function (appId, options) {
            return __awaiter(this, void 0, void 0, function () {
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.acl.enableApplicationAccessPolicy(__assign(__assign({}, options), { appId: appId, namespace: appId }))];
                        case 1: return [2 /*return*/, _a.sent()];
                    }
                });
            });
        };
        /**
         * @description 停用针对某个用户、角色、分组、组织机构的应用访问控制策略
         * @param appId
         * @param options
         */
        ApplicationsManagementClient.prototype.disableAccessPolicy = function (appId, options) {
            return __awaiter(this, void 0, void 0, function () {
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.acl.disableApplicationAccessPolicy(__assign(__assign({}, options), { appId: appId, namespace: appId }))];
                        case 1: return [2 /*return*/, _a.sent()];
                    }
                });
            });
        };
        /**
         * @description 删除针对某个用户、角色、分组、组织机构的应用访问控制策略
         * @param appId
         * @param options
         */
        ApplicationsManagementClient.prototype.deleteAccessPolicy = function (appId, options) {
            return __awaiter(this, void 0, void 0, function () {
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.acl.deleteApplicationAccessPolicy(__assign(__assign({}, options), { appId: appId, namespace: appId }))];
                        case 1: return [2 /*return*/, _a.sent()];
                    }
                });
            });
        };
        /**
         * @description 配置「允许主体(用户、角色、分组、组织机构节点)访问应用」的控制策略
         * @param appId
         * @param options
         */
        ApplicationsManagementClient.prototype.allowAccess = function (appId, options) {
            return __awaiter(this, void 0, void 0, function () {
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.acl.allowAccessApplication(__assign(__assign({}, options), { appId: appId, namespace: appId }))];
                        case 1: return [2 /*return*/, _a.sent()];
                    }
                });
            });
        };
        /**
         * @description 配置「拒绝主体(用户、角色、分组、组织机构节点)访问应用」的控制策略
         * @param appId
         * @param options
         */
        ApplicationsManagementClient.prototype.denyAccess = function (appId, options) {
            return __awaiter(this, void 0, void 0, function () {
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.acl.denyAccessApplication(__assign(__assign({}, options), { appId: appId, namespace: appId }))];
                        case 1: return [2 /*return*/, _a.sent()];
                    }
                });
            });
        };
        /**
         * @description 更改默认应用访问策略
         * @param appId
         * @param defaultStrategy
         */
        ApplicationsManagementClient.prototype.updateDefaultAccessPolicy = function (appId, defaultStrategy) {
            return __awaiter(this, void 0, void 0, function () {
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.acl.updateDefaultApplicationAccessPolicy({
                                appId: appId,
                                defaultStrategy: defaultStrategy
                            })];
                        case 1: return [2 /*return*/, _a.sent()];
                    }
                });
            });
        };
        ApplicationsManagementClient.prototype.createRole = function (appId, options) {
            return __awaiter(this, void 0, void 0, function () {
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.roles.create(options.code, options.description, appId)];
                        case 1: return [2 /*return*/, _a.sent()];
                    }
                });
            });
        };
        ApplicationsManagementClient.prototype.deleteRole = function (appId, code) {
            return __awaiter(this, void 0, void 0, function () {
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.roles.delete(code, appId)];
                        case 1: return [2 /*return*/, _a.sent()];
                    }
                });
            });
        };
        ApplicationsManagementClient.prototype.deleteRoles = function (appId, codes) {
            return __awaiter(this, void 0, void 0, function () {
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.roles.deleteMany(codes, appId)];
                        case 1: return [2 /*return*/, _a.sent()];
                    }
                });
            });
        };
        ApplicationsManagementClient.prototype.updateRole = function (appId, options) {
            return __awaiter(this, void 0, void 0, function () {
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.roles.update(options.code, __assign(__assign({}, options), { namespace: appId }))];
                        case 1: return [2 /*return*/, _a.sent()];
                    }
                });
            });
        };
        ApplicationsManagementClient.prototype.findRole = function (appId, code) {
            return __awaiter(this, void 0, void 0, function () {
                return __generator(this, function (_a) {
                    return [2 /*return*/, this.roles.detail(code, appId)];
                });
            });
        };
        ApplicationsManagementClient.prototype.getRoles = function (appId, options) {
            return __awaiter(this, void 0, void 0, function () {
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.roles.list(__assign(__assign({}, options), { namespace: appId }))];
                        case 1: return [2 /*return*/, _a.sent()];
                    }
                });
            });
        };
        ApplicationsManagementClient.prototype.getUsersByRoleCode = function (appId, code) {
            return __awaiter(this, void 0, void 0, function () {
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.roles.listUsers(code, {
                                namespace: appId
                            })];
                        case 1: return [2 /*return*/, _a.sent()];
                    }
                });
            });
        };
        ApplicationsManagementClient.prototype.addUsersToRole = function (appId, code, userIds) {
            return __awaiter(this, void 0, void 0, function () {
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.roles.addUsers(code, userIds, appId)];
                        case 1: return [2 /*return*/, _a.sent()];
                    }
                });
            });
        };
        ApplicationsManagementClient.prototype.removeUsersFromRole = function (appId, code, userIds) {
            return __awaiter(this, void 0, void 0, function () {
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.roles.removeUsers(code, userIds, appId)];
                        case 1: return [2 /*return*/, _a.sent()];
                    }
                });
            });
        };
        ApplicationsManagementClient.prototype.listAuthorizedResourcesByRole = function (appId, code, resourceType) {
            return __awaiter(this, void 0, void 0, function () {
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.roles.listAuthorizedResources(code, appId, {
                                resourceType: resourceType
                            })];
                        case 1: return [2 /*return*/, _a.sent()];
                    }
                });
            });
        };
        ApplicationsManagementClient.prototype.createAgreement = function (appId, agreement) {
            return __awaiter(this, void 0, void 0, function () {
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.agreements.create(appId, agreement)];
                        case 1: return [2 /*return*/, _a.sent()];
                    }
                });
            });
        };
        ApplicationsManagementClient.prototype.deleteAgreement = function (appId, agreementId) {
            return __awaiter(this, void 0, void 0, function () {
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.agreements.delete(appId, agreementId)];
                        case 1: return [2 /*return*/, _a.sent()];
                    }
                });
            });
        };
        ApplicationsManagementClient.prototype.modifyAgreement = function (appId, agreementId, updates) {
            return __awaiter(this, void 0, void 0, function () {
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.agreements.modify(appId, agreementId, updates)];
                        case 1: return [2 /*return*/, _a.sent()];
                    }
                });
            });
        };
        ApplicationsManagementClient.prototype.listAgreement = function (appId) {
            return __awaiter(this, void 0, void 0, function () {
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.agreements.list(appId)];
                        case 1: return [2 /*return*/, _a.sent()];
                    }
                });
            });
        };
        ApplicationsManagementClient.prototype.sortAgreement = function (appId, order) {
            return __awaiter(this, void 0, void 0, function () {
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.agreements.sort(appId, order)];
                        case 1: return [2 /*return*/, _a.sent()];
                    }
                });
            });
        };
        /**
         * 查看应用下已登录用户
         * @param appId 应用 ID
         * @param page 当前页数
         * @param limit 每页显示条数
         * @returns Promise<Application>
         */
        ApplicationsManagementClient.prototype.activeUsers = function (appId, page, limit) {
            if (page === void 0) { page = 1; }
            if (limit === void 0) { limit = 10; }
            return __awaiter(this, void 0, void 0, function () {
                var result;
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.httpClient.request({
                                method: 'GET',
                                url: this.options.host + "/api/v2/applications/" + appId + "/active-users?page=" + page + "&limit=" + limit
                            })];
                        case 1:
                            result = _a.sent();
                            return [2 /*return*/, result];
                    }
                });
            });
        };
        /**
         * 刷新应用密钥
         * @param appId 应用 ID
         * @returns Promise<Application>
         */
        ApplicationsManagementClient.prototype.refreshApplicationSecret = function (appId) {
            return __awaiter(this, void 0, void 0, function () {
                var result;
                return __generator(this, function (_a) {
                    switch (_a.label) {
                        case 0: return [4 /*yield*/, this.httpClient.request({
                                method: 'PATCH',
                                url: this.options.host + "/api/v2/application/" + appId + "/refresh-secret"
                            })];
                        case 1:
                            result = _a.sent();
                            return [2 /*return*/, result];
                    }
                });
            });
        };
        return ApplicationsManagementClient;
    }());
    exports.ApplicationsManagementClient = ApplicationsManagementClient;
});
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiQXBwbGljYXRpb25zTWFuYWdlbWVudENsaWVudC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uLy4uL3NyYy9saWIvbWFuYWdlbWVudC9BcHBsaWNhdGlvbnNNYW5hZ2VtZW50Q2xpZW50LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7Ozs7O0lBU0EsNkRBQTREO0lBRTVELGlFQUFnRTtJQUVoRSx5RUFBd0U7SUFFeEU7Ozs7Ozs7Ozs7Ozs7Ozs7OztPQWtCRztJQUNIO1FBU0Usc0NBQ0UsT0FBZ0MsRUFDaEMsVUFBc0IsRUFDdEIsYUFBNEIsRUFDNUIsYUFBc0M7WUFFdEMsSUFBSSxDQUFDLE9BQU8sR0FBRyxPQUFPLENBQUM7WUFDdkIsSUFBSSxDQUFDLFVBQVUsR0FBRyxVQUFVLENBQUM7WUFDN0IsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7WUFDbkMsSUFBSSxDQUFDLGFBQWEsR0FBRyxhQUFhLENBQUM7WUFDbkMsSUFBSSxDQUFDLEdBQUcsR0FBRyxJQUFJLHlDQUFtQixDQUNoQyxPQUFPLEVBQ1AsYUFBYSxFQUNiLFVBQVUsRUFDVixhQUFhLENBQ2QsQ0FBQztZQUNGLElBQUksQ0FBQyxLQUFLLEdBQUcsSUFBSSw2Q0FBcUIsQ0FDcEMsT0FBTyxFQUNQLGFBQWEsRUFDYixhQUFhLENBQ2QsQ0FBQztZQUNGLElBQUksQ0FBQyxVQUFVLEdBQUcsSUFBSSxxREFBeUIsQ0FDN0MsT0FBTyxFQUNQLGFBQWEsRUFDYixVQUFVLEVBQ1YsYUFBYSxDQUNkLENBQUM7UUFDSixDQUFDO1FBRUQ7OztXQUdHO1FBQ1UsMkNBQUksR0FBakIsVUFBa0IsTUFHakI7Ozs7Ozs0QkFJTyxLQUEyQixNQUFNLElBQUksRUFBRSxFQUFyQyxZQUFRLEVBQVIsSUFBSSxtQkFBRyxDQUFDLEtBQUEsRUFBRSxhQUFVLEVBQVYsS0FBSyxtQkFBRyxF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