From 00ce79fa7b2e00dba4ae5ac58df12899423ace8b Mon Sep 17 00:00:00 2001 From: SikongJueluo Date: Wed, 14 May 2025 21:22:20 +0800 Subject: [PATCH] feat: add remote update function --- server/src/Controllers.cs | 59 ++++-- server/src/RemoteUpdate.cs | 19 ++ src/APIClient.ts | 409 +++++++++++++++++++++---------------- src/Common.ts | 20 ++ src/views/AdminView.vue | 219 +++++++++++++++----- src/views/HomeView.vue | 77 ++++--- 6 files changed, 520 insertions(+), 283 deletions(-) create mode 100644 src/Common.ts diff --git a/server/src/Controllers.cs b/server/src/Controllers.cs index 66cb836..7f17335 100644 --- a/server/src/Controllers.cs +++ b/server/src/Controllers.cs @@ -418,8 +418,9 @@ public class RemoteUpdater : ControllerBase /// 比特流文件3 /// 上传结果 [HttpPost("UploadBitstream")] - [ProducesResponseType(StatusCodes.Status200OK)] - [ProducesResponseType(StatusCodes.Status400BadRequest)] + [EnableCors("Users")] + [ProducesResponseType(typeof(bool), StatusCodes.Status200OK)] + [ProducesResponseType(typeof(ArgumentException), StatusCodes.Status400BadRequest)] public async ValueTask UploadBitstreams( string address, IFormFile? goldenBitream, @@ -469,7 +470,7 @@ public class RemoteUpdater : ControllerBase } logger.Info($"Device {address} Upload Bitstream Successfully"); - return TypedResults.Ok("Bitstream Upload Successfully"); + return TypedResults.Ok(true); } private async ValueTask> ProcessBitstream(string filePath) @@ -522,9 +523,10 @@ public class RemoteUpdater : ControllerBase /// 设备端口 /// 比特流位号 [HttpPost("DownloadBitstream")] - [ProducesResponseType(StatusCodes.Status200OK)] - [ProducesResponseType(StatusCodes.Status400BadRequest)] - [ProducesResponseType(StatusCodes.Status500InternalServerError)] + [EnableCors("Users")] + [ProducesResponseType(typeof(bool),StatusCodes.Status200OK)] + [ProducesResponseType(typeof(ArgumentException),StatusCodes.Status400BadRequest)] + [ProducesResponseType(typeof(Exception),StatusCodes.Status500InternalServerError)] public async ValueTask UpdateBitstream(string address, int port, int bitstreamNum) { // 检查文件 @@ -571,9 +573,10 @@ public class RemoteUpdater : ControllerBase /// 比特流编号 /// 总共上传比特流的数量 [HttpPost("DownloadMultiBitstreams")] - [ProducesResponseType(StatusCodes.Status200OK)] - [ProducesResponseType(StatusCodes.Status400BadRequest)] - [ProducesResponseType(StatusCodes.Status500InternalServerError)] + [EnableCors("Users")] + [ProducesResponseType(typeof(int),StatusCodes.Status200OK)] + [ProducesResponseType(typeof(ArgumentException),StatusCodes.Status400BadRequest)] + [ProducesResponseType(typeof(Exception),StatusCodes.Status500InternalServerError)] public async ValueTask DownloadMultiBitstreams(string address, int port, int? bitstreamNum) { // 检查文件 @@ -630,9 +633,10 @@ public class RemoteUpdater : ControllerBase /// 比特流编号 /// 操作结果 [HttpPost("HotResetBitstream")] - [ProducesResponseType(StatusCodes.Status200OK)] - [ProducesResponseType(StatusCodes.Status400BadRequest)] - [ProducesResponseType(StatusCodes.Status500InternalServerError)] + [EnableCors("Users")] + [ProducesResponseType(typeof(bool),StatusCodes.Status200OK)] + [ProducesResponseType(typeof(ArgumentException),StatusCodes.Status400BadRequest)] + [ProducesResponseType(typeof(Exception),StatusCodes.Status500InternalServerError)] public async ValueTask HotResetBitstream(string address, int port, int bitstreamNum) { var remoteUpdater = new RemoteUpdate.RemoteUpdateClient(address, port); @@ -640,7 +644,7 @@ public class RemoteUpdater : ControllerBase if (ret.IsSuccessful) { - logger.Info($"Device {address}即可 Update bitstream successfully"); + logger.Info($"Device {address} Update bitstream successfully"); return TypedResults.Ok(ret.Value); } else @@ -649,6 +653,35 @@ public class RemoteUpdater : ControllerBase return TypedResults.InternalServerError(ret.Error); } } + + /// + /// [TODO:description] + /// + /// [TODO:parameter] + /// [TODO:parameter] + /// [TODO:return] + [HttpPost("GetFirmwareVersion")] + [EnableCors("Users")] + [ProducesResponseType(typeof(UInt32),StatusCodes.Status200OK)] + [ProducesResponseType(typeof(ArgumentException),StatusCodes.Status400BadRequest)] + [ProducesResponseType(typeof(Exception),StatusCodes.Status500InternalServerError)] + public async ValueTask GetFirmwareVersion(string address, int port) + { + var remoteUpdater = new RemoteUpdate.RemoteUpdateClient(address, port); + var ret = await remoteUpdater.GetVersion(); + + if (ret.IsSuccessful) + { + logger.Info($"Device {address} get firmware version successfully"); + return TypedResults.Ok(ret.Value); + } + else + { + logger.Error(ret.Error); + return TypedResults.InternalServerError(ret.Error); + } + } + } diff --git a/server/src/RemoteUpdate.cs b/server/src/RemoteUpdate.cs index b6db774..a160b43 100644 --- a/server/src/RemoteUpdate.cs +++ b/server/src/RemoteUpdate.cs @@ -532,4 +532,23 @@ public class RemoteUpdateClient } } + /// + /// [TODO:description] + /// + /// [TODO:return] + public async ValueTask> GetVersion() + { + await MsgBus.UDPServer.ClearUDPData(this.address); + logger.Trace("Clear udp data finished"); + + { + var ret = await UDPClientPool.ReadAddr(this.ep, RemoteUpdateClientAddr.Version, this.timeout); + if (!ret.IsSuccessful) return new(ret.Error); + + var retData = ret.Value.Options.Data; + if (retData is null || retData.Length != 4) return new(new Exception("Failed to read remote update firmware version")); + var version = Common.Number.BytesToUInt32(retData); + return version; + } + } } diff --git a/src/APIClient.ts b/src/APIClient.ts index 49a46e5..bdd3396 100644 --- a/src/APIClient.ts +++ b/src/APIClient.ts @@ -8,47 +8,6 @@ /* eslint-disable */ // ReSharper disable InconsistentNaming -export class Client { - private http: { fetch(url: RequestInfo, init?: RequestInit): Promise }; - private baseUrl: string; - protected jsonParseReviver: ((key: string, value: any) => any) | undefined = undefined; - - constructor(baseUrl?: string, http?: { fetch(url: RequestInfo, init?: RequestInit): Promise }) { - this.http = http ? http : window as any; - this.baseUrl = baseUrl ?? "http://localhost:5000"; - } - - get(): Promise { - let url_ = this.baseUrl + "/"; - url_ = url_.replace(/[?&]$/, ""); - - let options_: RequestInit = { - method: "GET", - headers: { - } - }; - - return this.http.fetch(url_, options_).then((_response: Response) => { - return this.processGet(_response); - }); - } - - protected processGet(response: Response): Promise { - const status = response.status; - let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; - if (status === 200) { - return response.text().then((_responseText) => { - return; - }); - } else if (status !== 200 && status !== 204) { - return response.text().then((_responseText) => { - return throwException("An unexpected server error occurred.", status, _responseText, _headers); - }); - } - return Promise.resolve(null as any); - } -} - export class UDPClient { private http: { fetch(url: RequestInfo, init?: RequestInit): Promise }; private baseUrl: string; @@ -408,63 +367,6 @@ export class JtagClient { return Promise.resolve(null as any); } - /** - * 执行一个Jtag命令 - * @param address (optional) 设备地址 - * @param port (optional) 设备端口 - * @param hexDevAddr (optional) 16进制设备目的地址(Jtag) - * @param hexCmd (optional) 16进制命令 - */ - runCommand(address: string | undefined, port: number | undefined, hexDevAddr: string | undefined, hexCmd: string | undefined): Promise { - let url_ = this.baseUrl + "/api/Jtag/RunCommand?"; - if (address === null) - throw new Error("The parameter 'address' cannot be null."); - else if (address !== undefined) - url_ += "address=" + encodeURIComponent("" + address) + "&"; - if (port === null) - throw new Error("The parameter 'port' cannot be null."); - else if (port !== undefined) - url_ += "port=" + encodeURIComponent("" + port) + "&"; - if (hexDevAddr === null) - throw new Error("The parameter 'hexDevAddr' cannot be null."); - else if (hexDevAddr !== undefined) - url_ += "hexDevAddr=" + encodeURIComponent("" + hexDevAddr) + "&"; - if (hexCmd === null) - throw new Error("The parameter 'hexCmd' cannot be null."); - else if (hexCmd !== undefined) - url_ += "hexCmd=" + encodeURIComponent("" + hexCmd) + "&"; - url_ = url_.replace(/[?&]$/, ""); - - let options_: RequestInit = { - method: "POST", - headers: { - } - }; - - return this.http.fetch(url_, options_).then((_response: Response) => { - return this.processRunCommand(_response); - }); - } - - protected processRunCommand(response: Response): Promise { - const status = response.status; - let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; - if (status === 200) { - return response.text().then((_responseText) => { - return; - }); - } else if (status === 500) { - return response.text().then((_responseText) => { - return throwException("A server side error occurred.", status, _responseText, _headers); - }); - } else if (status !== 200 && status !== 204) { - return response.text().then((_responseText) => { - return throwException("An unexpected server error occurred.", status, _responseText, _headers); - }); - } - return Promise.resolve(null as any); - } - /** * 获取Jtag ID Code * @param address (optional) 设备地址 @@ -686,6 +588,75 @@ export class JtagClient { } return Promise.resolve(null as any); } + + /** + * [TODO:description] + * @param address (optional) [TODO:parameter] + * @param port (optional) [TODO:parameter] + * @param portNum (optional) [TODO:parameter] + * @return [TODO:return] + */ + boundaryScan(address: string | undefined, port: number | undefined, portNum: number | undefined): Promise { + let url_ = this.baseUrl + "/api/Jtag/BoundaryScan?"; + if (address === null) + throw new Error("The parameter 'address' cannot be null."); + else if (address !== undefined) + url_ += "address=" + encodeURIComponent("" + address) + "&"; + if (port === null) + throw new Error("The parameter 'port' cannot be null."); + else if (port !== undefined) + url_ += "port=" + encodeURIComponent("" + port) + "&"; + if (portNum === null) + throw new Error("The parameter 'portNum' cannot be null."); + else if (portNum !== undefined) + url_ += "portNum=" + encodeURIComponent("" + portNum) + "&"; + url_ = url_.replace(/[?&]$/, ""); + + let options_: RequestInit = { + method: "POST", + headers: { + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processBoundaryScan(_response); + }); + } + + protected processBoundaryScan(response: Response): Promise { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 200) { + return response.text().then((_responseText) => { + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = resultData200 !== undefined ? resultData200 : null; + + return result200; + }); + } else if (status === 400) { + return response.text().then((_responseText) => { + let result400: any = null; + let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result400 = resultData400 !== undefined ? resultData400 : null; + + return throwException("A server side error occurred.", status, _responseText, _headers, result400); + }); + } else if (status === 500) { + return response.text().then((_responseText) => { + let result500: any = null; + let resultData500 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result500 = Exception.fromJS(resultData500); + return throwException("A server side error occurred.", status, _responseText, _headers, result500); + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve(null as any); + } } export class RemoteUpdaterClient { @@ -707,7 +678,7 @@ export class RemoteUpdaterClient { * @param bitstream3 (optional) * @return 上传结果 */ - uploadBitstreams(address: string | undefined, goldenBitream: FileParameter | null | undefined, bitstream1: FileParameter | null | undefined, bitstream2: FileParameter | null | undefined, bitstream3: FileParameter | null | undefined): Promise { + uploadBitstreams(address: string | undefined, goldenBitream: FileParameter | null | undefined, bitstream1: FileParameter | null | undefined, bitstream2: FileParameter | null | undefined, bitstream3: FileParameter | null | undefined): Promise { let url_ = this.baseUrl + "/api/RemoteUpdater/UploadBitstream?"; if (address === null) throw new Error("The parameter 'address' cannot be null."); @@ -729,6 +700,7 @@ export class RemoteUpdaterClient { body: content_, method: "POST", headers: { + "Accept": "application/json" } }; @@ -737,18 +709,22 @@ export class RemoteUpdaterClient { }); } - protected processUploadBitstreams(response: Response): Promise { + protected processUploadBitstreams(response: Response): Promise { const status = response.status; let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; if (status === 200) { return response.text().then((_responseText) => { - return; + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = resultData200 !== undefined ? resultData200 : null; + + return result200; }); } else if (status === 400) { return response.text().then((_responseText) => { let result400: any = null; let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); - result400 = ProblemDetails.fromJS(resultData400); + result400 = ArgumentException.fromJS(resultData400); return throwException("A server side error occurred.", status, _responseText, _headers, result400); }); } else if (status !== 200 && status !== 204) { @@ -756,7 +732,7 @@ export class RemoteUpdaterClient { return throwException("An unexpected server error occurred.", status, _responseText, _headers); }); } - return Promise.resolve(null as any); + return Promise.resolve(null as any); } /** @@ -765,7 +741,7 @@ export class RemoteUpdaterClient { * @param port (optional) 设备端口 * @param bitstreamNum (optional) 比特流位号 */ - updateBitstream(address: string | undefined, port: number | undefined, bitstreamNum: number | undefined): Promise { + updateBitstream(address: string | undefined, port: number | undefined, bitstreamNum: number | undefined): Promise { let url_ = this.baseUrl + "/api/RemoteUpdater/DownloadBitstream?"; if (address === null) throw new Error("The parameter 'address' cannot be null."); @@ -784,6 +760,7 @@ export class RemoteUpdaterClient { let options_: RequestInit = { method: "POST", headers: { + "Accept": "application/json" } }; @@ -792,30 +769,37 @@ export class RemoteUpdaterClient { }); } - protected processUpdateBitstream(response: Response): Promise { + protected processUpdateBitstream(response: Response): Promise { const status = response.status; let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; if (status === 200) { return response.text().then((_responseText) => { - return; + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = resultData200 !== undefined ? resultData200 : null; + + return result200; }); } else if (status === 400) { return response.text().then((_responseText) => { let result400: any = null; let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); - result400 = ProblemDetails.fromJS(resultData400); + result400 = ArgumentException.fromJS(resultData400); return throwException("A server side error occurred.", status, _responseText, _headers, result400); }); } else if (status === 500) { return response.text().then((_responseText) => { - return throwException("A server side error occurred.", status, _responseText, _headers); + let result500: any = null; + let resultData500 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result500 = Exception.fromJS(resultData500); + return throwException("A server side error occurred.", status, _responseText, _headers, result500); }); } else if (status !== 200 && status !== 204) { return response.text().then((_responseText) => { return throwException("An unexpected server error occurred.", status, _responseText, _headers); }); } - return Promise.resolve(null as any); + return Promise.resolve(null as any); } /** @@ -825,7 +809,7 @@ export class RemoteUpdaterClient { * @param bitstreamNum (optional) 比特流编号 * @return 总共上传比特流的数量 */ - downloadMultiBitstreams(address: string | undefined, port: number | undefined, bitstreamNum: number | null | undefined): Promise { + downloadMultiBitstreams(address: string | undefined, port: number | undefined, bitstreamNum: number | null | undefined): Promise { let url_ = this.baseUrl + "/api/RemoteUpdater/DownloadMultiBitstreams?"; if (address === null) throw new Error("The parameter 'address' cannot be null."); @@ -842,6 +826,7 @@ export class RemoteUpdaterClient { let options_: RequestInit = { method: "POST", headers: { + "Accept": "application/json" } }; @@ -850,30 +835,37 @@ export class RemoteUpdaterClient { }); } - protected processDownloadMultiBitstreams(response: Response): Promise { + protected processDownloadMultiBitstreams(response: Response): Promise { const status = response.status; let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; if (status === 200) { return response.text().then((_responseText) => { - return; + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = resultData200 !== undefined ? resultData200 : null; + + return result200; }); } else if (status === 400) { return response.text().then((_responseText) => { let result400: any = null; let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); - result400 = ProblemDetails.fromJS(resultData400); + result400 = ArgumentException.fromJS(resultData400); return throwException("A server side error occurred.", status, _responseText, _headers, result400); }); } else if (status === 500) { return response.text().then((_responseText) => { - return throwException("A server side error occurred.", status, _responseText, _headers); + let result500: any = null; + let resultData500 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result500 = Exception.fromJS(resultData500); + return throwException("A server side error occurred.", status, _responseText, _headers, result500); }); } else if (status !== 200 && status !== 204) { return response.text().then((_responseText) => { return throwException("An unexpected server error occurred.", status, _responseText, _headers); }); } - return Promise.resolve(null as any); + return Promise.resolve(null as any); } /** @@ -883,7 +875,7 @@ export class RemoteUpdaterClient { * @param bitstreamNum (optional) 比特流编号 * @return 操作结果 */ - hotResetBitstream(address: string | undefined, port: number | undefined, bitstreamNum: number | undefined): Promise { + hotResetBitstream(address: string | undefined, port: number | undefined, bitstreamNum: number | undefined): Promise { let url_ = this.baseUrl + "/api/RemoteUpdater/HotResetBitstream?"; if (address === null) throw new Error("The parameter 'address' cannot be null."); @@ -902,6 +894,7 @@ export class RemoteUpdaterClient { let options_: RequestInit = { method: "POST", headers: { + "Accept": "application/json" } }; @@ -910,30 +903,100 @@ export class RemoteUpdaterClient { }); } - protected processHotResetBitstream(response: Response): Promise { + protected processHotResetBitstream(response: Response): Promise { const status = response.status; let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; if (status === 200) { return response.text().then((_responseText) => { - return; + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = resultData200 !== undefined ? resultData200 : null; + + return result200; }); } else if (status === 400) { return response.text().then((_responseText) => { let result400: any = null; let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); - result400 = ProblemDetails.fromJS(resultData400); + result400 = ArgumentException.fromJS(resultData400); return throwException("A server side error occurred.", status, _responseText, _headers, result400); }); } else if (status === 500) { return response.text().then((_responseText) => { - return throwException("A server side error occurred.", status, _responseText, _headers); + let result500: any = null; + let resultData500 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result500 = Exception.fromJS(resultData500); + return throwException("A server side error occurred.", status, _responseText, _headers, result500); }); } else if (status !== 200 && status !== 204) { return response.text().then((_responseText) => { return throwException("An unexpected server error occurred.", status, _responseText, _headers); }); } - return Promise.resolve(null as any); + return Promise.resolve(null as any); + } + + /** + * [TODO:description] + * @param address (optional) [TODO:parameter] + * @param port (optional) [TODO:parameter] + * @return [TODO:return] + */ + getFirmwareVersion(address: string | undefined, port: number | undefined): Promise { + let url_ = this.baseUrl + "/api/RemoteUpdater/GetFirmwareVersion?"; + if (address === null) + throw new Error("The parameter 'address' cannot be null."); + else if (address !== undefined) + url_ += "address=" + encodeURIComponent("" + address) + "&"; + if (port === null) + throw new Error("The parameter 'port' cannot be null."); + else if (port !== undefined) + url_ += "port=" + encodeURIComponent("" + port) + "&"; + url_ = url_.replace(/[?&]$/, ""); + + let options_: RequestInit = { + method: "POST", + headers: { + "Accept": "application/json" + } + }; + + return this.http.fetch(url_, options_).then((_response: Response) => { + return this.processGetFirmwareVersion(_response); + }); + } + + protected processGetFirmwareVersion(response: Response): Promise { + const status = response.status; + let _headers: any = {}; if (response.headers && response.headers.forEach) { response.headers.forEach((v: any, k: any) => _headers[k] = v); }; + if (status === 200) { + return response.text().then((_responseText) => { + let result200: any = null; + let resultData200 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result200 = resultData200 !== undefined ? resultData200 : null; + + return result200; + }); + } else if (status === 400) { + return response.text().then((_responseText) => { + let result400: any = null; + let resultData400 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result400 = ArgumentException.fromJS(resultData400); + return throwException("A server side error occurred.", status, _responseText, _headers, result400); + }); + } else if (status === 500) { + return response.text().then((_responseText) => { + let result500: any = null; + let resultData500 = _responseText === "" ? null : JSON.parse(_responseText, this.jsonParseReviver); + result500 = Exception.fromJS(resultData500); + return throwException("A server side error occurred.", status, _responseText, _headers, result500); + }); + } else if (status !== 200 && status !== 204) { + return response.text().then((_responseText) => { + return throwException("An unexpected server error occurred.", status, _responseText, _headers); + }); + } + return Promise.resolve(null as any); } } @@ -1303,84 +1366,68 @@ export interface IException { stackTrace?: string | undefined; } -export class ProblemDetails implements IProblemDetails { - type?: string | undefined; - title?: string | undefined; - status?: number | undefined; - detail?: string | undefined; - instance?: string | undefined; - extensions?: { [key: string]: any; }; +export class SystemException extends Exception implements ISystemException { - [key: string]: any; - - constructor(data?: IProblemDetails) { - if (data) { - for (var property in data) { - if (data.hasOwnProperty(property)) - (this)[property] = (data)[property]; - } - } + constructor(data?: ISystemException) { + super(data); } init(_data?: any) { - if (_data) { - for (var property in _data) { - if (_data.hasOwnProperty(property)) - this[property] = _data[property]; - } - this.type = _data["type"]; - this.title = _data["title"]; - this.status = _data["status"]; - this.detail = _data["detail"]; - this.instance = _data["instance"]; - if (_data["extensions"]) { - this.extensions = {} as any; - for (let key in _data["extensions"]) { - if (_data["extensions"].hasOwnProperty(key)) - (this.extensions)![key] = _data["extensions"][key]; - } - } - } + super.init(_data); } - static fromJS(data: any): ProblemDetails { + static fromJS(data: any): SystemException { data = typeof data === 'object' ? data : {}; - let result = new ProblemDetails(); + let result = new SystemException(); result.init(data); return result; } toJSON(data?: any) { data = typeof data === 'object' ? data : {}; - for (var property in this) { - if (this.hasOwnProperty(property)) - data[property] = this[property]; - } - data["type"] = this.type; - data["title"] = this.title; - data["status"] = this.status; - data["detail"] = this.detail; - data["instance"] = this.instance; - if (this.extensions) { - data["extensions"] = {}; - for (let key in this.extensions) { - if (this.extensions.hasOwnProperty(key)) - (data["extensions"])[key] = (this.extensions)[key]; - } - } + super.toJSON(data); return data; } } -export interface IProblemDetails { - type?: string | undefined; - title?: string | undefined; - status?: number | undefined; - detail?: string | undefined; - instance?: string | undefined; - extensions?: { [key: string]: any; }; +export interface ISystemException extends IException { +} - [key: string]: any; +export class ArgumentException extends SystemException implements IArgumentException { + message?: string; + paramName?: string | undefined; + + constructor(data?: IArgumentException) { + super(data); + } + + init(_data?: any) { + super.init(_data); + if (_data) { + this.message = _data["Message"]; + this.paramName = _data["ParamName"]; + } + } + + static fromJS(data: any): ArgumentException { + data = typeof data === 'object' ? data : {}; + let result = new ArgumentException(); + result.init(data); + return result; + } + + toJSON(data?: any) { + data = typeof data === 'object' ? data : {}; + data["Message"] = this.message; + data["ParamName"] = this.paramName; + super.toJSON(data); + return data; + } +} + +export interface IArgumentException extends ISystemException { + message?: string; + paramName?: string | undefined; } export interface FileParameter { diff --git a/src/Common.ts b/src/Common.ts new file mode 100644 index 0000000..f658f9d --- /dev/null +++ b/src/Common.ts @@ -0,0 +1,20 @@ +import { type FileParameter } from "./APIClient"; +import { isNull, isUndefined } from "lodash"; + +export namespace Common { + export function toFileParameter(object: File): FileParameter { + return { + data: object, + fileName: object.name + } + } + + export function toFileParameterOrNull(object?: File | null): FileParameter | null { + if (isNull(object) || isUndefined(object)) return null; + else return { + data: object, + fileName: object.name + } + } + +} diff --git a/src/views/AdminView.vue b/src/views/AdminView.vue index 5d62def..6b7a691 100644 --- a/src/views/AdminView.vue +++ b/src/views/AdminView.vue @@ -1,11 +1,20 @@ diff --git a/src/views/HomeView.vue b/src/views/HomeView.vue index db36d82..c817949 100644 --- a/src/views/HomeView.vue +++ b/src/views/HomeView.vue @@ -1,77 +1,88 @@ -