каркас вроде есть
This commit is contained in:
@@ -0,0 +1,78 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.ApprovalRouteApi = void 0;
|
||||
var tslib_1 = require("tslib");
|
||||
// Тонкий 1:1 фасад над контроллерами бэкенда:
|
||||
// backend/src/Tnsu.ApprovalRoute.Api/Controllers/{RequestTypes,TemplateRoutes,TemplateRouteSteps}Controller.cs
|
||||
var ApprovalRouteApi = /** @class */ (function () {
|
||||
function ApprovalRouteApi(http) {
|
||||
var _this = this;
|
||||
this.http = http;
|
||||
this.requestTypes = {
|
||||
list: function () {
|
||||
return _this.http.get('/api/request-types');
|
||||
},
|
||||
get: function (id) {
|
||||
return _this.http.get("/api/request-types/".concat(id));
|
||||
},
|
||||
create: function (body) {
|
||||
return _this.http.post('/api/request-types', body);
|
||||
},
|
||||
update: function (id, body) {
|
||||
return _this.http.put("/api/request-types/".concat(id), body);
|
||||
},
|
||||
patch: function (id, body) {
|
||||
return _this.http.patch("/api/request-types/".concat(id), body);
|
||||
},
|
||||
remove: function (id) {
|
||||
return _this.http.delete("/api/request-types/".concat(id));
|
||||
}
|
||||
};
|
||||
this.templateRoutes = {
|
||||
list: function (requestTypeId) {
|
||||
return _this.http.get('/api/template-routes', { requestTypeId: requestTypeId });
|
||||
},
|
||||
get: function (id) {
|
||||
return _this.http.get("/api/template-routes/".concat(id));
|
||||
},
|
||||
create: function (body) {
|
||||
return _this.http.post('/api/template-routes', body);
|
||||
},
|
||||
update: function (id, body) {
|
||||
return _this.http.put("/api/template-routes/".concat(id), body);
|
||||
},
|
||||
patch: function (id, body) {
|
||||
return _this.http.patch("/api/template-routes/".concat(id), body);
|
||||
},
|
||||
remove: function (id) {
|
||||
return _this.http.delete("/api/template-routes/".concat(id));
|
||||
},
|
||||
resolve: function (query) {
|
||||
return _this.http.get('/api/template-routes/resolve', tslib_1.__assign({}, query));
|
||||
}
|
||||
};
|
||||
this.templateRouteSteps = {
|
||||
list: function (routeId) {
|
||||
return _this.http.get("/api/template-routes/".concat(routeId, "/steps"));
|
||||
},
|
||||
get: function (routeId, id) {
|
||||
return _this.http.get("/api/template-routes/".concat(routeId, "/steps/").concat(id));
|
||||
},
|
||||
create: function (routeId, body) {
|
||||
return _this.http.post("/api/template-routes/".concat(routeId, "/steps"), body);
|
||||
},
|
||||
update: function (routeId, id, body) {
|
||||
return _this.http.put("/api/template-routes/".concat(routeId, "/steps/").concat(id), body);
|
||||
},
|
||||
patch: function (routeId, id, body) {
|
||||
return _this.http.patch("/api/template-routes/".concat(routeId, "/steps/").concat(id), body);
|
||||
},
|
||||
remove: function (routeId, id) {
|
||||
return _this.http.delete("/api/template-routes/".concat(routeId, "/steps/").concat(id));
|
||||
}
|
||||
};
|
||||
}
|
||||
return ApprovalRouteApi;
|
||||
}());
|
||||
exports.ApprovalRouteApi = ApprovalRouteApi;
|
||||
//# sourceMappingURL=api.js.map
|
||||
File diff suppressed because one or more lines are too long
@@ -0,0 +1,172 @@
|
||||
"use strict";
|
||||
Object.defineProperty(exports, "__esModule", { value: true });
|
||||
exports.DevApiHttpClient = exports.AadApiHttpClient = exports.ApiClientError = void 0;
|
||||
var tslib_1 = require("tslib");
|
||||
var sp_http_1 = require("@microsoft/sp-http");
|
||||
var ApiClientError = /** @class */ (function (_super) {
|
||||
tslib_1.__extends(ApiClientError, _super);
|
||||
function ApiClientError(status, messages) {
|
||||
var _this = _super.call(this, messages.join('; ') || "HTTP ".concat(status)) || this;
|
||||
_this.status = status;
|
||||
_this.messages = messages;
|
||||
return _this;
|
||||
}
|
||||
return ApiClientError;
|
||||
}(Error));
|
||||
exports.ApiClientError = ApiClientError;
|
||||
function buildUrl(baseUrl, path, query) {
|
||||
var normalizedBase = baseUrl.endsWith('/') ? baseUrl : "".concat(baseUrl, "/");
|
||||
var url = new URL(path.replace(/^\//, ''), normalizedBase);
|
||||
if (query) {
|
||||
Object.keys(query).forEach(function (key) {
|
||||
var value = query[key];
|
||||
if (value !== undefined && value !== null && value !== '') {
|
||||
url.searchParams.set(key, String(value));
|
||||
}
|
||||
});
|
||||
}
|
||||
return url.toString();
|
||||
}
|
||||
function parseResponse(response) {
|
||||
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
||||
var text, json, messages;
|
||||
var _a, _b;
|
||||
return tslib_1.__generator(this, function (_c) {
|
||||
switch (_c.label) {
|
||||
case 0:
|
||||
if (response.status === 204) {
|
||||
return [2 /*return*/, undefined];
|
||||
}
|
||||
return [4 /*yield*/, response.text()];
|
||||
case 1:
|
||||
text = _c.sent();
|
||||
try {
|
||||
json = text ? JSON.parse(text) : undefined;
|
||||
}
|
||||
catch (_d) {
|
||||
// Ответ пришёл не в конверте ApiResponse/ApiError (например, "сырая" страница
|
||||
// необработанного исключения ASP.NET Core или ошибка от прокси перед API).
|
||||
if (!response.ok) {
|
||||
throw new ApiClientError(response.status, [text || "HTTP ".concat(response.status)]);
|
||||
}
|
||||
throw new ApiClientError(response.status, ['Сервер вернул не-JSON ответ.']);
|
||||
}
|
||||
if (!response.ok) {
|
||||
messages = (_a = json === null || json === void 0 ? void 0 : json.messages) !== null && _a !== void 0 ? _a : ["HTTP ".concat(response.status)];
|
||||
throw new ApiClientError(response.status, messages);
|
||||
}
|
||||
return [2 /*return*/, (_b = json === null || json === void 0 ? void 0 : json.data) !== null && _b !== void 0 ? _b : undefined];
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
/**
|
||||
* Прод/staging: вызовы через AAD-защищённое SPFx-подключение (AadHttpClient).
|
||||
* Требует webApiPermissionRequests в package-solution.json и админского
|
||||
* согласия в SharePoint admin center → Advanced → API access.
|
||||
*/
|
||||
var AadApiHttpClient = /** @class */ (function () {
|
||||
function AadApiHttpClient(client, baseUrl) {
|
||||
this.client = client;
|
||||
this.baseUrl = baseUrl;
|
||||
}
|
||||
AadApiHttpClient.prototype.get = function (path, query) {
|
||||
var url = buildUrl(this.baseUrl, path, query);
|
||||
return this.client
|
||||
.get(url, sp_http_1.AadHttpClient.configurations.v1)
|
||||
.then(function (r) { return parseResponse(r); });
|
||||
};
|
||||
AadApiHttpClient.prototype.post = function (path, body) {
|
||||
return this.send('POST', path, body);
|
||||
};
|
||||
AadApiHttpClient.prototype.put = function (path, body) {
|
||||
return this.send('PUT', path, body);
|
||||
};
|
||||
AadApiHttpClient.prototype.patch = function (path, body) {
|
||||
return this.send('PATCH', path, body);
|
||||
};
|
||||
AadApiHttpClient.prototype.delete = function (path) {
|
||||
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
||||
return tslib_1.__generator(this, function (_a) {
|
||||
switch (_a.label) {
|
||||
case 0: return [4 /*yield*/, this.send('DELETE', path)];
|
||||
case 1:
|
||||
_a.sent();
|
||||
return [2 /*return*/];
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
AadApiHttpClient.prototype.send = function (method, path, body) {
|
||||
var url = buildUrl(this.baseUrl, path);
|
||||
return this.client
|
||||
.fetch(url, sp_http_1.AadHttpClient.configurations.v1, {
|
||||
method: method,
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: body !== undefined ? JSON.stringify(body) : undefined
|
||||
})
|
||||
.then(function (r) { return parseResponse(r); });
|
||||
};
|
||||
return AadApiHttpClient;
|
||||
}());
|
||||
exports.AadApiHttpClient = AadApiHttpClient;
|
||||
/**
|
||||
* Локальная отладка: обычный fetch с заголовком X-Dev-User-Email.
|
||||
* Работает только если бэкенд поднят с пустыми Entra:TenantId/Entra:Audience
|
||||
* (см. backend/.../Auth/AuthSetup.cs — тогда включается DevAuthHandler).
|
||||
*/
|
||||
var DevApiHttpClient = /** @class */ (function () {
|
||||
function DevApiHttpClient(baseUrl, devUserEmail) {
|
||||
this.baseUrl = baseUrl;
|
||||
this.devUserEmail = devUserEmail;
|
||||
}
|
||||
DevApiHttpClient.prototype.get = function (path, query) {
|
||||
return this.send('GET', path, undefined, query);
|
||||
};
|
||||
DevApiHttpClient.prototype.post = function (path, body) {
|
||||
return this.send('POST', path, body);
|
||||
};
|
||||
DevApiHttpClient.prototype.put = function (path, body) {
|
||||
return this.send('PUT', path, body);
|
||||
};
|
||||
DevApiHttpClient.prototype.patch = function (path, body) {
|
||||
return this.send('PATCH', path, body);
|
||||
};
|
||||
DevApiHttpClient.prototype.delete = function (path) {
|
||||
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
||||
return tslib_1.__generator(this, function (_a) {
|
||||
switch (_a.label) {
|
||||
case 0: return [4 /*yield*/, this.send('DELETE', path)];
|
||||
case 1:
|
||||
_a.sent();
|
||||
return [2 /*return*/];
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
DevApiHttpClient.prototype.send = function (method, path, body, query) {
|
||||
return tslib_1.__awaiter(this, void 0, void 0, function () {
|
||||
var url, response;
|
||||
return tslib_1.__generator(this, function (_a) {
|
||||
switch (_a.label) {
|
||||
case 0:
|
||||
url = buildUrl(this.baseUrl, path, query);
|
||||
return [4 /*yield*/, fetch(url, {
|
||||
method: method,
|
||||
headers: {
|
||||
'Content-Type': 'application/json',
|
||||
'X-Dev-User-Email': this.devUserEmail
|
||||
},
|
||||
body: body !== undefined ? JSON.stringify(body) : undefined
|
||||
})];
|
||||
case 1:
|
||||
response = _a.sent();
|
||||
return [2 /*return*/, parseResponse(response)];
|
||||
}
|
||||
});
|
||||
});
|
||||
};
|
||||
return DevApiHttpClient;
|
||||
}());
|
||||
exports.DevApiHttpClient = DevApiHttpClient;
|
||||
//# sourceMappingURL=httpClient.js.map
|
||||
File diff suppressed because one or more lines are too long
Reference in New Issue
Block a user