From 73a539f449f2f6ec7bc7adaa18ebbe1b1b45ad9c Mon Sep 17 00:00:00 2001 From: TAMARA JERINIC Date: Sat, 16 Apr 2022 00:42:36 +0200 Subject: Omogućeno prikupljanje rezultata metrika nakon završenog treniranja modela. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/microservice/api/newmlservice.py | 19 ++++++++++++------- 1 file changed, 12 insertions(+), 7 deletions(-) (limited to 'backend') diff --git a/backend/microservice/api/newmlservice.py b/backend/microservice/api/newmlservice.py index d19a4e44..ecadb0f4 100644 --- a/backend/microservice/api/newmlservice.py +++ b/backend/microservice/api/newmlservice.py @@ -21,6 +21,7 @@ from sklearn.model_selection import train_test_split from dataclasses import dataclass import statistics as s from sklearn.metrics import roc_auc_score + #from ann_visualizer.visualize import ann_viz; def returnColumnsInfo(dataset): dict=[] @@ -224,7 +225,7 @@ def train(dataset, params, callback): # # ###OPTIMIZATORI - + """ if(params['optimizer']=='adam'): opt=tf.keras.optimizers.Adam(learning_rate=params['learningRate']) @@ -276,7 +277,7 @@ def train(dataset, params, callback): activityreg=tf.keras.regularizers.l2(reg['activityRate']) elif(reg['kernelType']=='l1l2'): activityreg=tf.keras.regularizers.l1_l2(l1=reg['activityRate'][0],l2=reg['activityRate'][1]) - + """ if(problem_type=='multi-klasifikacioni'): #print('multi') @@ -293,17 +294,19 @@ def train(dataset, params, callback): classifier.compile(loss =params["lossFunction"] , optimizer = params['optimizer'] , metrics =params['metrics']) history=classifier.fit(x_train, y_train, epochs = params['epochs'],batch_size=params['batchSize']) - + + hist=history.history + y_pred=classifier.predict(x_test) y_pred=np.argmax(y_pred,axis=1) - #print(y_pred.flatten()) - #print(y_test) + scores = classifier.evaluate(x_test, y_test) #print("\n%s: %.2f%%" % (classifier.metrics_names[1], scores[1]*100)) classifier.save("temp/"+params['name'], save_format='h5') #vizuelizacija u python-u #from ann_visualizer.visualize import ann_viz; #ann_viz(classifier, title="My neural network") + return hist elif(problem_type=='binarni-klasifikacioni'): #print('*************************************************************************binarni') @@ -318,7 +321,7 @@ def train(dataset, params, callback): classifier.compile(loss =params["lossFunction"] , optimizer = params['optimizer'] , metrics =params['metrics']) history=classifier.fit(x_train, y_train, epochs = params['epochs'],batch_size=params['batchSize']) - + hist=history.history y_pred=classifier.predict(x_test) y_pred=(y_pred>=0.5).astype('int') @@ -330,6 +333,7 @@ def train(dataset, params, callback): #ann_viz(classifier, title="My neural network") classifier.save("temp/"+params['name'], save_format='h5') + return hist elif(problem_type=='regresioni'): classifier=tf.keras.Sequential() @@ -343,9 +347,10 @@ def train(dataset, params, callback): classifier.compile(loss =params["lossFunction"] , optimizer = params['optimizer'] , metrics =params['metrics']) history=classifier.fit(x_train, y_train, epochs = params['epochs'],batch_size=params['batchSize']) + hist=history.history y_pred=classifier.predict(x_test) #print(classifier.evaluate(x_test, y_test)) - + return hist def roc_auc_score_multiclass(actual_class, pred_class, average = "macro"): #creating a set of all the unique classes using the actual class list -- cgit v1.2.3 From e8db6c2081155f9c4fed7c8a06e37e89a7398101 Mon Sep 17 00:00:00 2001 From: Ivan Ljubisavljevic Date: Sat, 16 Apr 2022 14:16:04 +0200 Subject: Zavrsen predict i povezan sa ml-om. #105 --- backend/api/api/Controllers/PredictorController.cs | 19 ++++++++++++++----- backend/api/api/Models/Predictor.cs | 1 + backend/api/api/Services/IMlConnectionService.cs | 3 +++ backend/api/api/Services/MlConnectionService.cs | 18 ++++++++++++++++-- 4 files changed, 34 insertions(+), 7 deletions(-) (limited to 'backend') diff --git a/backend/api/api/Controllers/PredictorController.cs b/backend/api/api/Controllers/PredictorController.cs index 233ea401..87c32048 100644 --- a/backend/api/api/Controllers/PredictorController.cs +++ b/backend/api/api/Controllers/PredictorController.cs @@ -15,12 +15,14 @@ namespace api.Controllers private readonly IPredictorService _predictorService; private IJwtToken jwtToken; private readonly IMlConnectionService _mlConnectionService; + private readonly IExperimentService _experimentService; - public PredictorController(IPredictorService predictorService, IConfiguration configuration, IJwtToken Token, IMlConnectionService mlConnectionService) + public PredictorController(IPredictorService predictorService, IConfiguration configuration, IJwtToken Token, IMlConnectionService mlConnectionService, IExperimentService experimentService) { _predictorService = predictorService; jwtToken = Token; _mlConnectionService = mlConnectionService; + _experimentService = experimentService; } public string getUsername() @@ -160,7 +162,7 @@ namespace api.Controllers // POST api//usepredictor {predictor,inputs} [HttpPost("usepredictor/{id}")] [Authorize(Roles = "User,Guest")] - public ActionResult UsePredictor(String id, [FromBody] PredictorColumns[] inputs) + public async Task UsePredictor(String id, [FromBody] PredictorColumns[] inputs) { string username = getUsername(); @@ -168,10 +170,17 @@ namespace api.Controllers return BadRequest(); Predictor predictor = _predictorService.GetPredictor(username, id); - + + Experiment e = _experimentService.Get(predictor.experimentId); + + string result = await _mlConnectionService.Predict(predictor, e, inputs); + + //salji ml + + /* foreach(PredictorColumns i in inputs) - Debug.WriteLine(i.value.ToString()); - return NoContent(); + Debug.WriteLine(i.value.ToString());*/ + return Ok(result); } // PUT api//{name} diff --git a/backend/api/api/Models/Predictor.cs b/backend/api/api/Models/Predictor.cs index b1d6444b..3f9889be 100644 --- a/backend/api/api/Models/Predictor.cs +++ b/backend/api/api/Models/Predictor.cs @@ -18,6 +18,7 @@ namespace api.Models public bool accessibleByLink { get; set; } public DateTime dateCreated { get; set; } public string experimentId { get; set; } + public string h5FileId { get; set; } } } diff --git a/backend/api/api/Services/IMlConnectionService.cs b/backend/api/api/Services/IMlConnectionService.cs index d161bf49..d5dda9f2 100644 --- a/backend/api/api/Services/IMlConnectionService.cs +++ b/backend/api/api/Services/IMlConnectionService.cs @@ -8,6 +8,9 @@ namespace api.Services Task SendModelAsync(object model, object dataset); Task PreProcess(Dataset dataset, string filePath,string id); Task TrainModel(Model model, Experiment experiment, string filePath, Dataset dataset, string id); + + Task Predict(Predictor predictor, Experiment experiment, PredictorColumns[] inputs); + //Task PreProcess(Dataset dataset, byte[] file, string filename); } } \ No newline at end of file diff --git a/backend/api/api/Services/MlConnectionService.cs b/backend/api/api/Services/MlConnectionService.cs index bde9ce4c..4363b4ad 100644 --- a/backend/api/api/Services/MlConnectionService.cs +++ b/backend/api/api/Services/MlConnectionService.cs @@ -14,8 +14,9 @@ namespace api.Services private readonly IModelService _modelService; private readonly IHubContext _ichat; private readonly IConfiguration _configuration; + private readonly IFileService _fileService; - public MlConnectionService(IConfiguration configuration,IDatasetService datasetService,IHubContext ichat) + public MlConnectionService(IConfiguration configuration,IDatasetService datasetService,IHubContext ichat, IFileService fileService) { _configuration = configuration; @@ -23,6 +24,7 @@ namespace api.Services _datasetService=datasetService; _ichat=ichat; + _fileService = fileService; } public async Task SendModelAsync(object model, object dataset)//Don't Use @@ -67,8 +69,20 @@ namespace api.Services } - + public async Task Predict(Predictor predictor, Experiment experiment, PredictorColumns[] inputs) + { + string filePath = _fileService.GetFilePath(predictor.h5FileId, predictor.username); + + var request = new RestRequest("predict", Method.Post); + request.AddParameter("predictor", JsonConvert.SerializeObject(predictor)); + request.AddParameter("experiment", JsonConvert.SerializeObject(experiment)); + request.AddFile("file", filePath); + request.AddHeader("Content-Type", "multipart/form-data"); + + var result = await this.client.ExecuteAsync(request); + return result.Content; + } } } -- cgit v1.2.3 From d76cb349ef8d5254780e3ffb6afa7080513f2332 Mon Sep 17 00:00:00 2001 From: Danijel Anđelković Date: Sat, 16 Apr 2022 18:17:07 +0200 Subject: Update-ovao ML kontroler za predict. --- backend/microservice/api/config.py | 2 +- backend/microservice/api/controller.py | 16 ++++++++-------- backend/microservice/api/newmlservice.py | 5 +++++ 3 files changed, 14 insertions(+), 9 deletions(-) (limited to 'backend') diff --git a/backend/microservice/api/config.py b/backend/microservice/api/config.py index 2b6fbe89..8fb088a7 100644 --- a/backend/microservice/api/config.py +++ b/backend/microservice/api/config.py @@ -1,2 +1,2 @@ api_url = "http://localhost:5283/api" - +hostIP = "127.0.0.1:5543" \ No newline at end of file diff --git a/backend/microservice/api/controller.py b/backend/microservice/api/controller.py index 8e12c41d..d7564b70 100644 --- a/backend/microservice/api/controller.py +++ b/backend/microservice/api/controller.py @@ -9,7 +9,7 @@ import config app = flask.Flask(__name__) app.config["DEBUG"] = True -app.config["SERVER_NAME"] = "127.0.0.1:5543" +app.config["SERVER_NAME"] = config.hostIP class train_callback(tf.keras.callbacks.Callback): def __init__(self, x_test, y_test): @@ -33,19 +33,19 @@ def train(): paramsExperiment = json.loads(request.form["experiment"]) paramsDataset = json.loads(request.form["dataset"]) #dataset, paramsModel, paramsExperiment, callback) - result = newmlservice.train(data, paramsModel, paramsExperiment,paramsDataset, train_callback) + result = newmlservice.train(data, paramsModel, paramsExperiment, paramsDataset, train_callback) print(result) return jsonify(result) @app.route('/predict', methods = ['POST']) def predict(): - f = request.json['filepath'] - dataset = pd.read_csv(f) - m = request.json['modelpath'] - model = tf.keras.models.load_model(m) + h5 = request.files.get("h5file") + model = tf.keras.models.load_model(h5) + paramsExperiment = json.loads(request.form["experiment"]) + paramsPredictor = json.loads(request.form["predictor"]) print("********************************model loaded*******************************") - newmlservice.manageH5(dataset,request.json['model'],model) - return "done" + result = newmlservice.predict(paramsExperiment, paramsPredictor, model) + return result @app.route('/preprocess',methods=['POST']) def returnColumnsInfo(): diff --git a/backend/microservice/api/newmlservice.py b/backend/microservice/api/newmlservice.py index ecadb0f4..74ad232e 100644 --- a/backend/microservice/api/newmlservice.py +++ b/backend/microservice/api/newmlservice.py @@ -432,6 +432,11 @@ def train(dataset, params, callback): micro_averaged_f1=metrics.f1_score(y_test, y_pred, average = 'micro') roc_auc_dict=roc_auc_score_multiclass(y_test, y_pred) ''' +def predict(experiment, predictor, model) { + #model.predict() + # ovo je pre bilo manageH5 + return "TODO" +} def manageH5(dataset,params,h5model): problem_type = params["type"] -- cgit v1.2.3 From 717e15a9e0d35148a3cb0015b4b11b3abd291390 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Sat, 16 Apr 2022 18:36:22 +0200 Subject: Updajtovan Cors. Sve se uzima iz konfiguracionog fajla --- backend/api/api/Program.cs | 5 +-- backend/api/api/Properties/launchSettings.json | 46 +++++++++++--------------- backend/api/api/appsettings.json | 41 ++++++++++++----------- 3 files changed, 43 insertions(+), 49 deletions(-) (limited to 'backend') diff --git a/backend/api/api/Program.cs b/backend/api/api/Program.cs index 576093fe..71509b38 100644 --- a/backend/api/api/Program.cs +++ b/backend/api/api/Program.cs @@ -64,11 +64,12 @@ builder.Services.Configure(x => builder.Services.AddSignalR(); builder.Services.AddControllers(); - +string frontApi = builder.Configuration.GetValue("AppSettings:FrontApi"); +string mlApi = builder.Configuration.GetValue("AppSettings:MlApi"); builder.Services.AddCors(options => { options.AddPolicy("CorsPolicy", builder => builder - .WithOrigins("http://localhost:4200") + .WithOrigins(frontApi, mlApi) .AllowAnyMethod() .AllowAnyHeader() .AllowCredentials()); diff --git a/backend/api/api/Properties/launchSettings.json b/backend/api/api/Properties/launchSettings.json index 5c9dd2a8..f6c3fe8b 100644 --- a/backend/api/api/Properties/launchSettings.json +++ b/backend/api/api/Properties/launchSettings.json @@ -1,31 +1,23 @@ { - "$schema": "https://json.schemastore.org/launchsettings.json", - "iisSettings": { - "windowsAuthentication": false, - "anonymousAuthentication": true, - "iisExpress": { - "applicationUrl": "http://localhost:61918", - "sslPort": 0 - } - }, - "profiles": { - "api": { - "commandName": "Project", - "dotnetRunMessages": true, - "launchBrowser": false, - "launchUrl": "", - "applicationUrl": "http://localhost:5283", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } + "$schema": "https://json.schemastore.org/launchsettings.json", + "iisSettings": { + "windowsAuthentication": false, + "anonymousAuthentication": true, + "iisExpress": { + "applicationUrl": "http://localhost:61918", + "sslPort": 0 + } }, - "IIS Express": { - "commandName": "IISExpress", - "launchBrowser": false, - "launchUrl": "", - "environmentVariables": { - "ASPNETCORE_ENVIRONMENT": "Development" - } + "profiles": { + "api": { + "commandName": "Project", + "dotnetRunMessages": true, + "launchBrowser": false, + "launchUrl": "", + "applicationUrl": "http://localhost:5283", + "environmentVariables": { + "ASPNETCORE_ENVIRONMENT": "Development" + } + } } - } } diff --git a/backend/api/api/appsettings.json b/backend/api/api/appsettings.json index 42f62b75..e96549a8 100644 --- a/backend/api/api/appsettings.json +++ b/backend/api/api/appsettings.json @@ -1,27 +1,28 @@ { "AppSettings": { "JwtToken": "2mnttqPtRb4GIWHFtagm", - "MlApi": "http://127.0.0.1:5543" + "MlApi": "http://127.0.0.1:5543", + "FrontApi": "http://localhost:4200" }, - "Logging": { - "LogLevel": { - "Default": "Information", - "Microsoft.AspNetCore": "Warning" - } - }, - "AllowedHosts": "*", - "UserStoreDatabaseSettings": { - /* LocalHost*/ + "Logging": { + "LogLevel": { + "Default": "Information", + "Microsoft.AspNetCore": "Warning" + } + }, + "AllowedHosts": "*", + "UserStoreDatabaseSettings": { + /* LocalHost*/ - "ConnectionString": "mongodb://127.0.0.1:27017/", - "DatabaseName": "si_project", - "CollectionName": "users", - "DatasetCollectionName": "Dataset", - "ModelCollectionName": "Model", - "PredictorCollectionName": "Predictor", - "FilesCollectionName": "Files", - "ExperimentCollectionName": "Experiment" - /* + "ConnectionString": "mongodb://127.0.0.1:27017/", + "DatabaseName": "si_project", + "CollectionName": "users", + "DatasetCollectionName": "Dataset", + "ModelCollectionName": "Model", + "PredictorCollectionName": "Predictor", + "FilesCollectionName": "Files", + "ExperimentCollectionName": "Experiment" + /* "ConnectionString": "mongodb+srv://si_user:si_user@sidatabase.twtfm.mongodb.net/myFirstDatabase?retryWrites=true&w=majority", "DatabaseName": "si_db", "CollectionName": "users", @@ -30,5 +31,5 @@ "PredictorCollectionName": "Predictor", "FilesCollectionName": "Files", "ExperimentCollectionName": "Experiment" */ - } + } } \ No newline at end of file -- cgit v1.2.3 From 4a6665959aa8b17e3dd0235530b46c3315d520db Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Sat, 16 Apr 2022 18:41:19 +0200 Subject: Fix. --- backend/microservice/api/newmlservice.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'backend') diff --git a/backend/microservice/api/newmlservice.py b/backend/microservice/api/newmlservice.py index 74ad232e..3427e287 100644 --- a/backend/microservice/api/newmlservice.py +++ b/backend/microservice/api/newmlservice.py @@ -432,11 +432,11 @@ def train(dataset, params, callback): micro_averaged_f1=metrics.f1_score(y_test, y_pred, average = 'micro') roc_auc_dict=roc_auc_score_multiclass(y_test, y_pred) ''' -def predict(experiment, predictor, model) { +def predict(experiment, predictor, model): #model.predict() # ovo je pre bilo manageH5 return "TODO" -} + def manageH5(dataset,params,h5model): problem_type = params["type"] -- cgit v1.2.3 From 74e467d41e7234bc806e9ba30c6766791601ec6b Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Sat, 16 Apr 2022 19:13:02 +0200 Subject: Izmenjeni predictor i predictor servis. Poruka se salje korisniku po zavrsetku treniranja sa id prediktora. --- backend/api/api/Controllers/PredictorController.cs | 76 ++++++++++++---------- backend/api/api/Models/Predictor.cs | 13 +++- backend/api/api/Services/IPredictorService.cs | 23 +++---- backend/api/api/Services/MlConnectionService.cs | 6 +- backend/api/api/Services/PredictorService.cs | 16 ++--- 5 files changed, 69 insertions(+), 65 deletions(-) (limited to 'backend') diff --git a/backend/api/api/Controllers/PredictorController.cs b/backend/api/api/Controllers/PredictorController.cs index 87c32048..481334e9 100644 --- a/backend/api/api/Controllers/PredictorController.cs +++ b/backend/api/api/Controllers/PredictorController.cs @@ -5,6 +5,7 @@ using Microsoft.AspNetCore.Mvc; using Microsoft.Net.Http.Headers; using System.Net.Http.Headers; using System.Diagnostics; +using Microsoft.AspNetCore.SignalR; namespace api.Controllers { @@ -16,13 +17,19 @@ namespace api.Controllers private IJwtToken jwtToken; private readonly IMlConnectionService _mlConnectionService; private readonly IExperimentService _experimentService; + private readonly IUserService _userService; + private readonly IHubContext _ichat; + private readonly IModelService _modelService; - public PredictorController(IPredictorService predictorService, IConfiguration configuration, IJwtToken Token, IMlConnectionService mlConnectionService, IExperimentService experimentService) + public PredictorController(IPredictorService predictorService, IConfiguration configuration, IJwtToken Token, IMlConnectionService mlConnectionService, IExperimentService experimentService,IUserService userService, IHubContext ichat,IModelService modelService) { _predictorService = predictorService; jwtToken = Token; _mlConnectionService = mlConnectionService; _experimentService = experimentService; + _userService = userService; + _ichat = ichat; + _modelService = modelService; } public string getUsername() @@ -65,17 +72,18 @@ namespace api.Controllers //SEARCH za predictore (public ili private sa ovim imenom ) // GET api//search/{name} - [HttpGet("search/{name}")] - [Authorize(Roles = "User")] - public ActionResult> Search(string name) - { - string username = getUsername(); + + //[HttpGet("search/{name}")] + //[Authorize(Roles = "User")] + //public ActionResult> Search(string name) + //{ + // string username = getUsername(); - if (username == null) - return BadRequest(); + // if (username == null) + // return BadRequest(); - return _predictorService.SearchPredictors(name, username); - } + // return _predictorService.SearchPredictors(name, username); + //} // GET api//getpredictor/{name} [HttpGet("getpredictor/{id}")] @@ -98,17 +106,17 @@ namespace api.Controllers // GET api//{name} [HttpGet("{name}")] [Authorize(Roles = "User")] - public ActionResult Get(string name) + public ActionResult Get(string id) { string username = getUsername(); if (username == null) return BadRequest(); - var predictor = _predictorService.GetOnePredictor(username, name); + var predictor = _predictorService.GetOnePredictor(id); if (predictor == null) - return NotFound($"Predictor with name = {name} not found or predictor is not public"); + return NotFound($"Predictor with id = {id} not found or predictor is not public"); return predictor; } @@ -144,19 +152,17 @@ namespace api.Controllers // POST api//add [HttpPost("add")] - [Authorize(Roles = "User")] - public ActionResult Post([FromBody] Predictor predictor) + public async Task> Post([FromBody] Predictor predictor) { - var existingPredictor = _predictorService.GetOnePredictor(predictor.username, predictor.name); - - if (existingPredictor != null) - return NotFound($"Predictor with name = {predictor.name} exisits"); - else - { - _predictorService.Create(predictor); - - return CreatedAtAction(nameof(Get), new { id = predictor._id }, predictor); - } + var user=_userService.GetUserByUsername(predictor.username); + var model = _modelService.GetOneModel(predictor.modelId); + if (model == null || user==null) + return BadRequest("Model not found or user doesnt exist"); + _predictorService.Create(predictor); + if (ChatHub.CheckUser(user._id)) + await _ichat.Clients.Client(ChatHub.Users[user._id]).SendAsync("NotifyPredictor", predictor._id,model.name); + return CreatedAtAction(nameof(Get), new { id = predictor._id }, predictor); + } // POST api//usepredictor {predictor,inputs} @@ -186,42 +192,42 @@ namespace api.Controllers // PUT api//{name} [HttpPut("{name}")] [Authorize(Roles = "User")] - public ActionResult Put(string name, [FromBody] Predictor predictor) + public ActionResult Put(string id, [FromBody] Predictor predictor) { string username = getUsername(); if (username == null) return BadRequest(); - var existingPredictor = _predictorService.GetOnePredictor(username, name); + var existingPredictor = _predictorService.GetOnePredictor(id); //ne mora da se proverava if (existingPredictor == null) - return NotFound($"Predictor with name = {name} or user with username = {username} not found"); + return NotFound($"Predictor with id = {id} or user with username = {username} not found"); - _predictorService.Update(username, name, predictor); + _predictorService.Update(id, predictor); - return Ok($"Predictor with name = {name} updated"); + return Ok($"Predictor with id = {id} updated"); } // DELETE api//name [HttpDelete("{name}")] [Authorize(Roles = "User")] - public ActionResult Delete(string name) + public ActionResult Delete(string id) { string username = getUsername(); if (username == null) return BadRequest(); - var predictor = _predictorService.GetOnePredictor(username, name); + var predictor = _predictorService.GetOnePredictor(id); if (predictor == null) - return NotFound($"Predictor with name = {name} or user with username = {username} not found"); + return NotFound($"Predictor with id = {id} or user with username = {username} not found"); - _predictorService.Delete(predictor.username, predictor.name); + _predictorService.Delete(id); - return Ok($"Predictor with name = {name} deleted"); + return Ok($"Predictor with id = {id} deleted"); } } diff --git a/backend/api/api/Models/Predictor.cs b/backend/api/api/Models/Predictor.cs index 3f9889be..26371d2a 100644 --- a/backend/api/api/Models/Predictor.cs +++ b/backend/api/api/Models/Predictor.cs @@ -10,17 +10,26 @@ namespace api.Models [BsonRepresentation(BsonType.ObjectId)]//mongo data type to .net public string _id { get; set; } public string username { get; set; } - public string name { get; set; } - public string description { get; set; } + //public string name { get; set; } + //public string description { get; set; } public string[] inputs { get; set; } public string output { get; set; } public bool isPublic { get; set; } public bool accessibleByLink { get; set; } public DateTime dateCreated { get; set; } public string experimentId { get; set; } + public string modelId { get; set; } public string h5FileId { get; set; } + public Metric[] metrics { get; set; } + } + public class Metric + { + string Name { get; set; } + string JsonValue { get; set; } + + } } /* diff --git a/backend/api/api/Services/IPredictorService.cs b/backend/api/api/Services/IPredictorService.cs index 729dd0b6..7c31215e 100644 --- a/backend/api/api/Services/IPredictorService.cs +++ b/backend/api/api/Services/IPredictorService.cs @@ -1,19 +1,16 @@ -using System; -using api.Models; +using api.Models; namespace api.Services { - public interface IPredictorService - { - Predictor GetOnePredictor(string username, string name); - Predictor GetPredictor(string username, string GetPredictor); - List SearchPredictors(string name, string username); + public interface IPredictorService + { + Predictor Create(Predictor predictor); + void Delete(string id); List GetMyPredictors(string username); - List SortPredictors(string username, bool ascdsc, int latest); + Predictor GetOnePredictor(string id); + Predictor GetPredictor(string username, string id); List GetPublicPredictors(); - Predictor Create(Predictor predictor); - void Update(string username, string name, Predictor predictor); - void Delete(string username, string name); + List SortPredictors(string username, bool ascdsc, int latest); + void Update(string id, Predictor predictor); } -} - +} \ No newline at end of file diff --git a/backend/api/api/Services/MlConnectionService.cs b/backend/api/api/Services/MlConnectionService.cs index 4363b4ad..22db0aea 100644 --- a/backend/api/api/Services/MlConnectionService.cs +++ b/backend/api/api/Services/MlConnectionService.cs @@ -43,11 +43,7 @@ namespace api.Services //request.AddFile("file", file,filename); request.AddFile("file", filePath); request.AddHeader("Content-Type", "multipart/form-data"); - var result = await this.client.ExecuteAsync(request); - - if (ChatHub.CheckUser(id)) - await _ichat.Clients.Client(ChatHub.Users[id]).SendAsync("NotifyModel",model.name,model._id); - + this.client.ExecuteAsync(request); return; } diff --git a/backend/api/api/Services/PredictorService.cs b/backend/api/api/Services/PredictorService.cs index b89eaded..144248d4 100644 --- a/backend/api/api/Services/PredictorService.cs +++ b/backend/api/api/Services/PredictorService.cs @@ -14,10 +14,6 @@ namespace api.Services _predictor = database.GetCollection(settings.PredictorCollectionName); } - public List SearchPredictors(string name, string username) - { - return _predictor.Find(predictor => predictor.name == name && predictor.isPublic == true).ToList(); - } public Predictor Create(Predictor predictor) { @@ -25,9 +21,9 @@ namespace api.Services return predictor; } - public void Delete(string username, string name) + public void Delete(string id) { - _predictor.DeleteOne(predictor => (predictor.username == username && predictor.name == name)); + _predictor.DeleteOne(predictor => (predictor._id == id)); } public List GetMyPredictors(string username) @@ -35,9 +31,9 @@ namespace api.Services return _predictor.Find(predictor => predictor.username == username).ToList(); } - public Predictor GetOnePredictor(string username, string name) + public Predictor GetOnePredictor(string id) { - return _predictor.Find(predictor => predictor.username == username && predictor.name == name).FirstOrDefault(); + return _predictor.Find(predictor => predictor._id == id).FirstOrDefault(); } public Predictor GetPredictor(string username, string id) @@ -62,9 +58,9 @@ namespace api.Services return _predictor.Find(predictor => predictor.isPublic == true).ToList(); } - public void Update(string username, string name, Predictor predictor) + public void Update(string id, Predictor predictor) { - _predictor.ReplaceOne(predictor => predictor.username == username && predictor.name == name, predictor); + _predictor.ReplaceOne(predictor => predictor._id == id, predictor); } } } -- cgit v1.2.3 From 0839b7a0217160214cce8ae881fa0b76810850df Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Sat, 16 Apr 2022 19:16:55 +0200 Subject: Uplodovanje h5 fajla vraca id tog fajla u bazi --- backend/api/api/Controllers/FileController.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'backend') diff --git a/backend/api/api/Controllers/FileController.cs b/backend/api/api/Controllers/FileController.cs index b9b31500..6888f1c7 100644 --- a/backend/api/api/Controllers/FileController.cs +++ b/backend/api/api/Controllers/FileController.cs @@ -105,7 +105,7 @@ namespace api.Controllers fileModel = _fileservice.Create(fileModel); - return Ok(fileModel); + return Ok(fileModel._id); } [HttpGet("csvread/{hasHeader}/{fileId}")] -- cgit v1.2.3 From fdd1bdcbe113c568dbeef4de6b9a5ad3c9652ef8 Mon Sep 17 00:00:00 2001 From: TAMARA JERINIC Date: Sat, 16 Apr 2022 19:42:35 +0200 Subject: Dodat zahtev za čuvanje h5 fajla treniranog modela. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/microservice/api/controller.py | 14 +++++- backend/microservice/api/newmlservice.py | 77 +++++++++++++++++--------------- 2 files changed, 55 insertions(+), 36 deletions(-) (limited to 'backend') diff --git a/backend/microservice/api/controller.py b/backend/microservice/api/controller.py index d7564b70..d2b8ed2c 100644 --- a/backend/microservice/api/controller.py +++ b/backend/microservice/api/controller.py @@ -1,3 +1,4 @@ +from gc import callbacks import flask from flask import request, jsonify import newmlservice @@ -27,14 +28,25 @@ class train_callback(tf.keras.callbacks.Callback): @app.route('/train', methods = ['POST']) def train(): print("******************************TRAIN*************************************************") + f = request.files.get("file") data = pd.read_csv(f) paramsModel = json.loads(request.form["model"]) paramsExperiment = json.loads(request.form["experiment"]) paramsDataset = json.loads(request.form["dataset"]) #dataset, paramsModel, paramsExperiment, callback) - result = newmlservice.train(data, paramsModel, paramsExperiment, paramsDataset, train_callback) + filepath,result = newmlservice.train(data, paramsModel, paramsExperiment,paramsDataset, train_callback) + """ + f = request.json['filepath'] + dataset = pd.read_csv(f) + filepath,result=newmlservice.train(dataset,request.json['model'],train_callback) print(result) + """ + + url = config.api_url + "/file/h5" + files = {'file': open(filepath, 'rb')} + r=requests.post(url, files=files) + fileId=r.text return jsonify(result) @app.route('/predict', methods = ['POST']) diff --git a/backend/microservice/api/newmlservice.py b/backend/microservice/api/newmlservice.py index 3427e287..e81192ab 100644 --- a/backend/microservice/api/newmlservice.py +++ b/backend/microservice/api/newmlservice.py @@ -1,5 +1,6 @@ from enum import unique from itertools import count +import os import pandas as pd from sklearn import datasets, multiclass import tensorflow as tf @@ -21,7 +22,7 @@ from sklearn.model_selection import train_test_split from dataclasses import dataclass import statistics as s from sklearn.metrics import roc_auc_score - +import matplotlib.pyplot as plt #from ann_visualizer.visualize import ann_viz; def returnColumnsInfo(dataset): dict=[] @@ -113,25 +114,25 @@ class TrainingResult: metrics: dict ''' -def train(dataset, params, callback): - problem_type = params["type"] +def train(dataset, paramsModel,paramsExperiment,paramsDataset,callback): + problem_type = paramsModel["type"] #print(problem_type) data = pd.DataFrame() #print(data) - for col in params["inputColumns"]: + for col in paramsExperiment["inputColumns"]: #print(col) data[col]=dataset[col] - output_column = params["columnToPredict"] + output_column = paramsExperiment["columnToPredict"] data[output_column] = dataset[output_column] #print(data) ###NULL - null_value_options = params["nullValues"] - null_values_replacers = params["nullValuesReplacers"] + null_value_options = paramsExperiment["nullValues"] + null_values_replacers = paramsExperiment["nullValuesReplacers"] if(null_value_options=='replace'): #print("replace null") # - dict=params['null_values_replacers'] + dict=null_values_replacers while(len(dict)>0): replace=dict.pop() col=replace['column'] @@ -154,7 +155,7 @@ def train(dataset, params, callback): data.pop(col) # ### Enkodiranje - encoding=params["encoding"] + encoding=paramsExperiment["encoding"] if(encoding=='label'): encoder=LabelEncoder() for col in data.columns: @@ -211,8 +212,8 @@ def train(dataset, params, callback): # # Podela na test i trening skupove # - test=params["randomTestSetDistribution"] - randomOrder = params["randomOrder"] + test=paramsExperiment["randomTestSetDistribution"] + randomOrder = paramsExperiment["randomOrder"] if(randomOrder): random=123 else: @@ -278,49 +279,54 @@ def train(dataset, params, callback): elif(reg['kernelType']=='l1l2'): activityreg=tf.keras.regularizers.l1_l2(l1=reg['activityRate'][0],l2=reg['activityRate'][1]) """ - + filepath=os.path.join("temp/",paramsExperiment['_id']+"_"+paramsModel['_id']) if(problem_type=='multi-klasifikacioni'): #print('multi') classifier=tf.keras.Sequential() - classifier.add(tf.keras.layers.Dense(units=params['hiddenLayerNeurons'], activation=params['hiddenLayerActivationFunctions'][0],input_dim=x_train.shape[1]))#prvi skriveni + definisanje prethodnog-ulaznog - for i in range(params['hiddenLayers']-1):#ako postoji vise od jednog skrivenog sloja + classifier.add(tf.keras.layers.Dense(units=paramsModel['hiddenLayerNeurons'], activation=paramsModel['hiddenLayerActivationFunctions'][0],input_dim=x_train.shape[1]))#prvi skriveni + definisanje prethodnog-ulaznog + for i in range(paramsModel['hiddenLayers']-1):#ako postoji vise od jednog skrivenog sloja #print(i) - classifier.add(tf.keras.layers.Dense(units=params['hiddenLayerNeurons'], activation=params['hiddenLayerActivationFunctions'][i+1]))#i-ti skriveni sloj - classifier.add(tf.keras.layers.Dense(units=5, activation=params['outputLayerActivationFunction']))#izlazni sloj + classifier.add(tf.keras.layers.Dense(units=paramsModel['hiddenLayerNeurons'], activation=paramsModel['hiddenLayerActivationFunctions'][i+1]))#i-ti skriveni sloj + classifier.add(tf.keras.layers.Dense(units=5, activation=paramsModel['outputLayerActivationFunction']))#izlazni sloj - classifier.compile(loss =params["lossFunction"] , optimizer = params['optimizer'] , metrics =params['metrics']) + classifier.compile(loss =paramsModel["lossFunction"] , optimizer = paramsModel['optimizer'] , metrics =paramsModel['metrics']) - history=classifier.fit(x_train, y_train, epochs = params['epochs'],batch_size=params['batchSize']) + history=classifier.fit(x_train, y_train, epochs = paramsModel['epochs'],batch_size=paramsModel['batchSize']) hist=history.history - + plt.plot(hist['accuracy']) + plt.show() y_pred=classifier.predict(x_test) y_pred=np.argmax(y_pred,axis=1) scores = classifier.evaluate(x_test, y_test) #print("\n%s: %.2f%%" % (classifier.metrics_names[1], scores[1]*100)) - classifier.save("temp/"+params['name'], save_format='h5') + + + classifier.save(filepath, save_format='h5') + #vizuelizacija u python-u #from ann_visualizer.visualize import ann_viz; #ann_viz(classifier, title="My neural network") - return hist + + return filepath,hist elif(problem_type=='binarni-klasifikacioni'): #print('*************************************************************************binarni') classifier=tf.keras.Sequential() - classifier.add(tf.keras.layers.Dense(units=params['hiddenLayerNeurons'], activation=params['hiddenLayerActivationFunctions'][0],input_dim=x_train.shape[1]))#prvi skriveni + definisanje prethodnog-ulaznog - for i in range(params['hiddenLayers']-1):#ako postoji vise od jednog skrivenog sloja + classifier.add(tf.keras.layers.Dense(units=paramsModel['hiddenLayerNeurons'], activation=paramsModel['hiddenLayerActivationFunctions'][0],input_dim=x_train.shape[1]))#prvi skriveni + definisanje prethodnog-ulaznog + for i in range(paramsModel['hiddenLayers']-1):#ako postoji vise od jednog skrivenog sloja #print(i) - classifier.add(tf.keras.layers.Dense(units=params['hiddenLayerNeurons'], activation=params['hiddenLayerActivationFunctions'][i+1]))#i-ti skriveni sloj - classifier.add(tf.keras.layers.Dense(units=1, activation=params['outputLayerActivationFunction']))#izlazni sloj + classifier.add(tf.keras.layers.Dense(units=paramsModel['hiddenLayerNeurons'], activation=paramsModel['hiddenLayerActivationFunctions'][i+1]))#i-ti skriveni sloj + classifier.add(tf.keras.layers.Dense(units=1, activation=paramsModel['outputLayerActivationFunction']))#izlazni sloj - classifier.compile(loss =params["lossFunction"] , optimizer = params['optimizer'] , metrics =params['metrics']) + classifier.compile(loss =paramsModel["lossFunction"] , optimizer = paramsModel['optimizer'] , metrics =paramsModel['metrics']) - history=classifier.fit(x_train, y_train, epochs = params['epochs'],batch_size=params['batchSize']) + history=classifier.fit(x_train, y_train, epochs = paramsModel['epochs'],batch_size=paramsModel['batchSize']) hist=history.history y_pred=classifier.predict(x_test) y_pred=(y_pred>=0.5).astype('int') @@ -332,25 +338,26 @@ def train(dataset, params, callback): #print("\n%s: %.2f%%" % (classifier.metrics_names[1], scores[1]*100)) #ann_viz(classifier, title="My neural network") - classifier.save("temp/"+params['name'], save_format='h5') - return hist + classifier.save(filepath, save_format='h5') + return filepath,hist elif(problem_type=='regresioni'): classifier=tf.keras.Sequential() - classifier.add(tf.keras.layers.Dense(units=params['hiddenLayerNeurons'], activation=params['hiddenLayerActivationFunctions'][0],input_dim=x_train.shape[1]))#prvi skriveni + definisanje prethodnog-ulaznog - for i in range(params['hiddenLayers']-1):#ako postoji vise od jednog skrivenog sloja + classifier.add(tf.keras.layers.Dense(units=paramsModel['hiddenLayerNeurons'], activation=paramsModel['hiddenLayerActivationFunctions'][0],input_dim=x_train.shape[1]))#prvi skriveni + definisanje prethodnog-ulaznog + for i in range(paramsModel['hiddenLayers']-1):#ako postoji vise od jednog skrivenog sloja #print(i) - classifier.add(tf.keras.layers.Dense(units=params['hiddenLayerNeurons'], activation=params['hiddenLayerActivationFunctions'][i+1]))#i-ti skriveni sloj + classifier.add(tf.keras.layers.Dense(units=paramsModel['hiddenLayerNeurons'], activation=paramsModel['hiddenLayerActivationFunctions'][i+1]))#i-ti skriveni sloj classifier.add(tf.keras.layers.Dense(units=1)) - classifier.compile(loss =params["lossFunction"] , optimizer = params['optimizer'] , metrics =params['metrics']) + classifier.compile(loss =paramsModel["lossFunction"] , optimizer = paramsModel['optimizer'] , metrics =paramsModel['metrics']) - history=classifier.fit(x_train, y_train, epochs = params['epochs'],batch_size=params['batchSize']) + history=classifier.fit(x_train, y_train, epochs = paramsModel['epochs'],batch_size=paramsModel['batchSize']) hist=history.history y_pred=classifier.predict(x_test) #print(classifier.evaluate(x_test, y_test)) - return hist + classifier.save(filepath, save_format='h5') + return filepath,hist def roc_auc_score_multiclass(actual_class, pred_class, average = "macro"): #creating a set of all the unique classes using the actual class list -- cgit v1.2.3 From 41bfcba0af1f375349b9fb1935aeb0e0856adff9 Mon Sep 17 00:00:00 2001 From: Nevena Bojovic Date: Sat, 16 Apr 2022 20:05:30 +0200 Subject: Pravi se predictor na ML. --- backend/microservice/api/controller.py | 33 ++++++++++++++++++++++++++++++++- 1 file changed, 32 insertions(+), 1 deletion(-) (limited to 'backend') diff --git a/backend/microservice/api/controller.py b/backend/microservice/api/controller.py index d2b8ed2c..95ceccbb 100644 --- a/backend/microservice/api/controller.py +++ b/backend/microservice/api/controller.py @@ -1,4 +1,6 @@ +from dataclasses import dataclass from gc import callbacks +from xmlrpc.client import DateTime import flask from flask import request, jsonify import newmlservice @@ -7,11 +9,27 @@ import pandas as pd import json import requests import config +from datetime import datetime app = flask.Flask(__name__) app.config["DEBUG"] = True app.config["SERVER_NAME"] = config.hostIP - + +@dataclass +class Predictor: + _id : str + username: str + inputs : list + output : str + isPublic: bool + accessibleByLink: bool + dateCreated: DateTime + experimentId: str + modelId: str + h5FileId: str + metrics: list + + class train_callback(tf.keras.callbacks.Callback): def __init__(self, x_test, y_test): self.x_test = x_test @@ -47,6 +65,19 @@ def train(): files = {'file': open(filepath, 'rb')} r=requests.post(url, files=files) fileId=r.text + predictor = Predictor() + predictor._id = "" + predictor.username = paramsModel["username"] + predictor.inputs = paramsExperiment["inputColumns"] + predictor.output = paramsExperiment["outputColumn"] + predictor.isPublic = False + predictor.accessibleByLink = False + predictor.dateCreated = datetime.now() + predictor.experimentId = paramsExperiment["_id"] + predictor.modelId = paramsModel["_id"] + predictor.h5FileId = fileId + + print(result) return jsonify(result) @app.route('/predict', methods = ['POST']) -- cgit v1.2.3 From 838139bbc7bee693cfb8d11e9a29e725bbe36ccb Mon Sep 17 00:00:00 2001 From: TAMARA JERINIC Date: Sat, 16 Apr 2022 20:37:05 +0200 Subject: Prepravka za usaglašavanje sa frontend-om. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/api/api/Controllers/FileController.cs | 1 - backend/microservice/api/controller.py | 25 ++-- backend/microservice/api/newmlservice.py | 6 +- frontend/package-lock.json | 178 +++++++++----------------- frontend/src/app/_data/Model.ts | 4 +- 5 files changed, 83 insertions(+), 131 deletions(-) (limited to 'backend') diff --git a/backend/api/api/Controllers/FileController.cs b/backend/api/api/Controllers/FileController.cs index 6888f1c7..d9494525 100644 --- a/backend/api/api/Controllers/FileController.cs +++ b/backend/api/api/Controllers/FileController.cs @@ -44,7 +44,6 @@ namespace api.Controllers } [HttpPost("h5")] - [Authorize(Roles = "User,Guest")] public async Task> H5Upload([FromForm] IFormFile file) { diff --git a/backend/microservice/api/controller.py b/backend/microservice/api/controller.py index 95ceccbb..437690ee 100644 --- a/backend/microservice/api/controller.py +++ b/backend/microservice/api/controller.py @@ -65,19 +65,22 @@ def train(): files = {'file': open(filepath, 'rb')} r=requests.post(url, files=files) fileId=r.text - predictor = Predictor() - predictor._id = "" - predictor.username = paramsModel["username"] - predictor.inputs = paramsExperiment["inputColumns"] - predictor.output = paramsExperiment["outputColumn"] - predictor.isPublic = False - predictor.accessibleByLink = False - predictor.dateCreated = datetime.now() - predictor.experimentId = paramsExperiment["_id"] - predictor.modelId = paramsModel["_id"] - predictor.h5FileId = fileId + predictor = Predictor( + _id = "", + username = paramsModel["username"], + inputs = paramsExperiment["inputColumns"], + output = paramsExperiment["outputColumn"], + isPublic = False, + accessibleByLink = False, + dateCreated = datetime.now(), + experimentId = paramsExperiment["_id"], + modelId = paramsModel["_id"], + h5FileId = fileId, + metrics=[] + ) print(result) + print(predictor) return jsonify(result) @app.route('/predict', methods = ['POST']) diff --git a/backend/microservice/api/newmlservice.py b/backend/microservice/api/newmlservice.py index e81192ab..585db480 100644 --- a/backend/microservice/api/newmlservice.py +++ b/backend/microservice/api/newmlservice.py @@ -122,7 +122,7 @@ def train(dataset, paramsModel,paramsExperiment,paramsDataset,callback): for col in paramsExperiment["inputColumns"]: #print(col) data[col]=dataset[col] - output_column = paramsExperiment["columnToPredict"] + output_column = paramsExperiment["outputColumn"] data[output_column] = dataset[output_column] #print(data) @@ -297,8 +297,8 @@ def train(dataset, paramsModel,paramsExperiment,paramsDataset,callback): history=classifier.fit(x_train, y_train, epochs = paramsModel['epochs'],batch_size=paramsModel['batchSize']) hist=history.history - plt.plot(hist['accuracy']) - plt.show() + #plt.plot(hist['accuracy']) + #plt.show() y_pred=classifier.predict(x_test) y_pred=np.argmax(y_pred,axis=1) diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 82cd01e6..488653db 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -452,7 +452,6 @@ "version": "13.2.5", "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-13.2.5.tgz", "integrity": "sha512-Xd8xj2Z0ilA4TJAM/JkTtA1CAa6SuebFsEEvabHCRO5MDvtdsIUP91ADUZIqDHy7qe6Qift/rAVN2PXxT2aaNA==", - "dev": true, "dependencies": { "@babel/core": "^7.17.2", "chokidar": "^3.0.0", @@ -482,7 +481,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", - "dev": true, "dependencies": { "@jridgewell/trace-mapping": "^0.3.0" }, @@ -494,7 +492,6 @@ "version": "7.17.5", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.5.tgz", "integrity": "sha512-/BBMw4EvjmyquN5O+t5eh0+YqB3XXJkYD2cjKpYtWOfFy4lQ4UozNSmxAcWT8r2XtZs0ewG+zrfsqeR15i1ajA==", - "dev": true, "dependencies": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", @@ -524,7 +521,6 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, "bin": { "semver": "bin/semver.js" } @@ -533,7 +529,6 @@ "version": "7.17.3", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.3.tgz", "integrity": "sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg==", - "dev": true, "dependencies": { "@babel/types": "^7.17.0", "jsesc": "^2.5.1", @@ -547,7 +542,6 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -787,7 +781,6 @@ "version": "7.16.12", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz", "integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.16.7", "@babel/generator": "^7.16.8", @@ -817,7 +810,6 @@ "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true, "bin": { "semver": "bin/semver.js" } @@ -826,7 +818,6 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -835,7 +826,6 @@ "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", - "dev": true, "dependencies": { "@babel/types": "^7.16.8", "jsesc": "^2.5.1", @@ -849,7 +839,6 @@ "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -3376,7 +3365,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, "dependencies": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -3650,7 +3638,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true, "engines": { "node": ">=8" } @@ -3747,7 +3734,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -3925,7 +3911,6 @@ "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, "funding": [ { "type": "individual", @@ -4944,7 +4929,6 @@ "version": "0.11.0", "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", - "dev": true, "engines": { "node": ">= 0.6.0" } @@ -5109,7 +5093,6 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, "optional": true, "dependencies": { "iconv-lite": "^0.6.2" @@ -5119,7 +5102,6 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, "optional": true, "dependencies": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -5923,7 +5905,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -6092,7 +6073,6 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, "hasInstallScript": true, "optional": true, "os": [ @@ -6202,7 +6182,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -6795,7 +6774,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "dependencies": { "binary-extensions": "^2.0.0" }, @@ -6849,7 +6827,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -6866,7 +6843,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -6893,7 +6869,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -7759,7 +7734,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "dependencies": { "yallist": "^4.0.0" }, @@ -7771,7 +7745,6 @@ "version": "0.25.7", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", - "dev": true, "dependencies": { "sourcemap-codec": "^1.4.4" } @@ -8396,7 +8369,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -9092,7 +9064,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -9907,7 +9878,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "dependencies": { "picomatch": "^2.2.1" }, @@ -9918,8 +9888,7 @@ "node_modules/reflect-metadata": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", - "dev": true + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" }, "node_modules/regenerate": { "version": "1.4.2", @@ -10209,7 +10178,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "devOptional": true }, "node_modules/sass": { "version": "1.49.0", @@ -10339,7 +10308,6 @@ "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, "dependencies": { "lru-cache": "^6.0.0" }, @@ -10724,8 +10692,7 @@ "node_modules/sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" }, "node_modules/spdy": { "version": "4.0.2", @@ -11126,7 +11093,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -11218,7 +11184,6 @@ "version": "4.5.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", - "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -11858,8 +11823,7 @@ "node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/yaml": { "version": "1.10.2", @@ -12194,7 +12158,6 @@ "version": "13.2.5", "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-13.2.5.tgz", "integrity": "sha512-Xd8xj2Z0ilA4TJAM/JkTtA1CAa6SuebFsEEvabHCRO5MDvtdsIUP91ADUZIqDHy7qe6Qift/rAVN2PXxT2aaNA==", - "dev": true, "requires": { "@babel/core": "^7.17.2", "chokidar": "^3.0.0", @@ -12212,7 +12175,6 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.1.2.tgz", "integrity": "sha512-hoyByceqwKirw7w3Z7gnIIZC3Wx3J484Y3L/cMpXFbr7d9ZQj2mODrirNzcJa+SM3UlpWXYvKV4RlRpFXlWgXg==", - "dev": true, "requires": { "@jridgewell/trace-mapping": "^0.3.0" } @@ -12221,7 +12183,6 @@ "version": "7.17.5", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.17.5.tgz", "integrity": "sha512-/BBMw4EvjmyquN5O+t5eh0+YqB3XXJkYD2cjKpYtWOfFy4lQ4UozNSmxAcWT8r2XtZs0ewG+zrfsqeR15i1ajA==", - "dev": true, "requires": { "@ampproject/remapping": "^2.1.0", "@babel/code-frame": "^7.16.7", @@ -12243,8 +12204,7 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" } } }, @@ -12252,7 +12212,6 @@ "version": "7.17.3", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.17.3.tgz", "integrity": "sha512-+R6Dctil/MgUsZsZAkYgK+ADNSZzJRRy0TvY65T71z/CR854xHQ1EweBYXdfT+HNeN7w0cSJJEzgxZMv40pxsg==", - "dev": true, "requires": { "@babel/types": "^7.17.0", "jsesc": "^2.5.1", @@ -12262,8 +12221,7 @@ "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" } } }, @@ -12408,7 +12366,6 @@ "version": "7.16.12", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.16.12.tgz", "integrity": "sha512-dK5PtG1uiN2ikk++5OzSYsitZKny4wOCD0nrO4TqnW4BVBTQ2NGS3NgilvT/TEyxTST7LNyWV/T4tXDoD3fOgg==", - "dev": true, "requires": { "@babel/code-frame": "^7.16.7", "@babel/generator": "^7.16.8", @@ -12430,14 +12387,12 @@ "semver": { "version": "6.3.0", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz", - "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", - "dev": true + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" }, "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" } } }, @@ -12445,7 +12400,6 @@ "version": "7.16.8", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.16.8.tgz", "integrity": "sha512-1ojZwE9+lOXzcWdWmO6TbUzDfqLD39CmEhN8+2cX9XkDo5yW1OpgfejfliysR2AWLpMamTiOiAp/mtroaymhpw==", - "dev": true, "requires": { "@babel/types": "^7.16.8", "jsesc": "^2.5.1", @@ -12455,8 +12409,7 @@ "source-map": { "version": "0.5.7", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", - "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", - "dev": true + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" } } }, @@ -13617,7 +13570,8 @@ "ws": { "version": "7.5.7", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", - "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==" + "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", + "requires": {} } } }, @@ -13633,7 +13587,8 @@ "version": "13.2.5", "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-13.2.5.tgz", "integrity": "sha512-obiPvwPe+UJUO8cfNbBxukLKG30F+gLF5/erexwklRknJzS4KP8ciH2on6XlTuXUahpDjbO0pffugFE2I/IszQ==", - "dev": true + "dev": true, + "requires": {} }, "@nodelib/fs.scandir": { "version": "2.1.5", @@ -14233,7 +14188,8 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true + "dev": true, + "requires": {} }, "adjust-sourcemap-loader": { "version": "4.0.0", @@ -14356,7 +14312,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.2.tgz", "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", - "dev": true, "requires": { "normalize-path": "^3.0.0", "picomatch": "^2.0.4" @@ -14554,8 +14509,7 @@ "binary-extensions": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.2.0.tgz", - "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", - "dev": true + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" }, "bl": { "version": "4.1.0", @@ -14626,7 +14580,8 @@ "bootstrap": { "version": "5.1.3", "resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.1.3.tgz", - "integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==" + "integrity": "sha512-fcQztozJ8jToQWXxVuEyXWW+dSo8AiXWKwiSSrKWsRB/Qt+Ewwza+JWoLKiTuQLaEPhdNAJ7+Dosc9DOIqNy7Q==", + "requires": {} }, "brace-expansion": { "version": "1.1.11", @@ -14641,7 +14596,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "requires": { "fill-range": "^7.0.1" } @@ -14770,7 +14724,6 @@ "version": "3.5.3", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.5.3.tgz", "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", - "dev": true, "requires": { "anymatch": "~3.1.2", "braces": "~3.0.2", @@ -14798,7 +14751,8 @@ "version": "5.2.2", "resolved": "https://registry.npmjs.org/circular-dependency-plugin/-/circular-dependency-plugin-5.2.2.tgz", "integrity": "sha512-g38K9Cm5WRwlaH6g03B9OEz/0qRizI+2I7n+Gz+L5DxXJAPAiWQvwlYNm1V1jkdpUv95bOe/ASm2vfi/G560jQ==", - "dev": true + "dev": true, + "requires": {} }, "clean-stack": { "version": "2.2.0", @@ -15276,7 +15230,8 @@ "version": "6.0.3", "resolved": "https://registry.npmjs.org/css-prefers-color-scheme/-/css-prefers-color-scheme-6.0.3.tgz", "integrity": "sha512-4BqMbZksRkJQx2zAjrokiGMd07RqOa2IxIrrN10lyBe9xhn9DEvjUK79J6jkeiv9D9hQFXKb6g1jwU62jziJZA==", - "dev": true + "dev": true, + "requires": {} }, "css-select": { "version": "4.2.1", @@ -15542,8 +15497,7 @@ "dependency-graph": { "version": "0.11.0", "resolved": "https://registry.npmjs.org/dependency-graph/-/dependency-graph-0.11.0.tgz", - "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==", - "dev": true + "integrity": "sha512-JeMq7fEshyepOWDfcfHK06N3MhyPhz++vtqWhMT5O9A3K42rdsEDpfdVqjaqaAhsw6a+ZqeDvQVtD0hFHQWrzg==" }, "destroy": { "version": "1.0.4", @@ -15678,7 +15632,6 @@ "version": "0.1.13", "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.13.tgz", "integrity": "sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==", - "dev": true, "optional": true, "requires": { "iconv-lite": "^0.6.2" @@ -15688,7 +15641,6 @@ "version": "0.6.3", "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "dev": true, "optional": true, "requires": { "safer-buffer": ">= 2.1.2 < 3.0.0" @@ -16212,7 +16164,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "requires": { "to-regex-range": "^5.0.1" } @@ -16335,7 +16286,6 @@ "version": "2.3.2", "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.2.tgz", "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", - "dev": true, "optional": true }, "function-bind": { @@ -16411,7 +16361,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "requires": { "is-glob": "^4.0.1" } @@ -16668,7 +16617,8 @@ "version": "5.1.0", "resolved": "https://registry.npmjs.org/icss-utils/-/icss-utils-5.1.0.tgz", "integrity": "sha512-soFhflCVWLfRNOPU3iv5Z9VUdT44xFRbzjLsEzSr5AQmgqPMTHdU3PMT1Cf1ssx8fLNJDA1juftYl+PUcv3MqA==", - "dev": true + "dev": true, + "requires": {} }, "ieee754": { "version": "1.2.1", @@ -16865,7 +16815,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, "requires": { "binary-extensions": "^2.0.0" } @@ -16897,8 +16846,7 @@ "is-extglob": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", - "dev": true + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" }, "is-fullwidth-code-point": { "version": "3.0.0", @@ -16909,7 +16857,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "requires": { "is-extglob": "^2.1.1" } @@ -16929,8 +16876,7 @@ "is-number": { "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" }, "is-path-cwd": { "version": "2.2.0", @@ -17354,7 +17300,8 @@ "version": "1.7.0", "resolved": "https://registry.npmjs.org/karma-jasmine-html-reporter/-/karma-jasmine-html-reporter-1.7.0.tgz", "integrity": "sha512-pzum1TL7j90DTE86eFt48/s12hqwQuiD+e5aXx2Dc9wDEn2LfGq6RoAxEZZjFiN0RDSCOnosEKRZWxbQ+iMpQQ==", - "dev": true + "dev": true, + "requires": {} }, "karma-source-map-support": { "version": "1.4.0", @@ -17576,7 +17523,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dev": true, "requires": { "yallist": "^4.0.0" } @@ -17585,7 +17531,6 @@ "version": "0.25.7", "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.25.7.tgz", "integrity": "sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==", - "dev": true, "requires": { "sourcemap-codec": "^1.4.4" } @@ -18046,8 +17991,7 @@ "normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, "normalize-range": { "version": "0.1.2", @@ -18580,8 +18524,7 @@ "picomatch": { "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" }, "pify": { "version": "2.3.0", @@ -18697,7 +18640,8 @@ "version": "8.0.0", "resolved": "https://registry.npmjs.org/postcss-custom-media/-/postcss-custom-media-8.0.0.tgz", "integrity": "sha512-FvO2GzMUaTN0t1fBULDeIvxr5IvbDXcIatt6pnJghc736nqNgsGao5NT+5+WVLAQiTt6Cb3YUms0jiPaXhL//g==", - "dev": true + "dev": true, + "requires": {} }, "postcss-custom-properties": { "version": "12.1.4", @@ -18767,13 +18711,15 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-font-variant/-/postcss-font-variant-5.0.0.tgz", "integrity": "sha512-1fmkBaCALD72CK2a9i468mA/+tr9/1cBxRRMXOUaZqO43oWPR5imcyPjXwuv7PXbCid4ndlP5zWhidQVVa3hmA==", - "dev": true + "dev": true, + "requires": {} }, "postcss-gap-properties": { "version": "3.0.3", "resolved": "https://registry.npmjs.org/postcss-gap-properties/-/postcss-gap-properties-3.0.3.tgz", "integrity": "sha512-rPPZRLPmEKgLk/KlXMqRaNkYTUpE7YC+bOIQFN5xcu1Vp11Y4faIXv6/Jpft6FMnl6YRxZqDZG0qQOW80stzxQ==", - "dev": true + "dev": true, + "requires": {} }, "postcss-image-set-function": { "version": "4.0.6", @@ -18799,7 +18745,8 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/postcss-initial/-/postcss-initial-4.0.1.tgz", "integrity": "sha512-0ueD7rPqX8Pn1xJIjay0AZeIuDoF+V+VvMt/uOnn+4ezUKhZM/NokDeP6DwMNyIoYByuN/94IQnt5FEkaN59xQ==", - "dev": true + "dev": true, + "requires": {} }, "postcss-lab-function": { "version": "4.1.1", @@ -18826,19 +18773,22 @@ "version": "5.0.4", "resolved": "https://registry.npmjs.org/postcss-logical/-/postcss-logical-5.0.4.tgz", "integrity": "sha512-RHXxplCeLh9VjinvMrZONq7im4wjWGlRJAqmAVLXyZaXwfDWP73/oq4NdIp+OZwhQUMj0zjqDfM5Fj7qby+B4g==", - "dev": true + "dev": true, + "requires": {} }, "postcss-media-minmax": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/postcss-media-minmax/-/postcss-media-minmax-5.0.0.tgz", "integrity": "sha512-yDUvFf9QdFZTuCUg0g0uNSHVlJ5X1lSzDZjPSFaiCWvjgsvu8vEVxtahPrLMinIDEEGnx6cBe6iqdx5YWz08wQ==", - "dev": true + "dev": true, + "requires": {} }, "postcss-modules-extract-imports": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz", "integrity": "sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw==", - "dev": true + "dev": true, + "requires": {} }, "postcss-modules-local-by-default": { "version": "4.0.0", @@ -18882,13 +18832,15 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/postcss-overflow-shorthand/-/postcss-overflow-shorthand-3.0.3.tgz", "integrity": "sha512-CxZwoWup9KXzQeeIxtgOciQ00tDtnylYIlJBBODqkgS/PU2jISuWOL/mYLHmZb9ZhZiCaNKsCRiLp22dZUtNsg==", - "dev": true + "dev": true, + "requires": {} }, "postcss-page-break": { "version": "3.0.4", "resolved": "https://registry.npmjs.org/postcss-page-break/-/postcss-page-break-3.0.4.tgz", "integrity": "sha512-1JGu8oCjVXLa9q9rFTo4MbeeA5FMe00/9C7lN4va606Rdb+HkxXtXsmEDrIraQ11fGz/WvKWa8gMuCKkrXpTsQ==", - "dev": true + "dev": true, + "requires": {} }, "postcss-place": { "version": "7.0.4", @@ -18953,7 +18905,8 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/postcss-replace-overflow-wrap/-/postcss-replace-overflow-wrap-4.0.0.tgz", "integrity": "sha512-KmF7SBPphT4gPPcKZc7aDkweHiKEEO8cla/GjcBK+ckKxiZslIu3C4GCRW3DNfL0o7yW7kMQu9xlZ1kXRXLXtw==", - "dev": true + "dev": true, + "requires": {} }, "postcss-selector-not": { "version": "5.0.0", @@ -19127,7 +19080,6 @@ "version": "3.6.0", "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, "requires": { "picomatch": "^2.2.1" } @@ -19135,8 +19087,7 @@ "reflect-metadata": { "version": "0.1.13", "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.1.13.tgz", - "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==", - "dev": true + "integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==" }, "regenerate": { "version": "1.4.2", @@ -19355,7 +19306,7 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "dev": true + "devOptional": true }, "sass": { "version": "1.49.0", @@ -19411,7 +19362,8 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true + "dev": true, + "requires": {} }, "json-schema-traverse": { "version": "0.4.1", @@ -19440,7 +19392,6 @@ "version": "7.3.5", "resolved": "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz", "integrity": "sha512-PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==", - "dev": true, "requires": { "lru-cache": "^6.0.0" } @@ -19756,8 +19707,7 @@ "sourcemap-codec": { "version": "1.4.8", "resolved": "https://registry.npmjs.org/sourcemap-codec/-/sourcemap-codec-1.4.8.tgz", - "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==", - "dev": true + "integrity": "sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==" }, "spdy": { "version": "4.0.2", @@ -19965,7 +19915,8 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true + "dev": true, + "requires": {} }, "json-schema-traverse": { "version": "0.4.1", @@ -20039,7 +19990,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, "requires": { "is-number": "^7.0.0" } @@ -20108,8 +20058,7 @@ "typescript": { "version": "4.5.5", "resolved": "https://registry.npmjs.org/typescript/-/typescript-4.5.5.tgz", - "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==", - "dev": true + "integrity": "sha512-TCTIul70LyWe6IJWT8QSYeA54WQe8EjQFU4wY52Fasj5UKx88LNYKCgBEHcOMOrFF1rKGbD8v/xcNWVUq9SymA==" }, "ua-parser-js": { "version": "0.7.31", @@ -20318,7 +20267,8 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true + "dev": true, + "requires": {} }, "json-schema-traverse": { "version": "0.4.1", @@ -20554,7 +20504,8 @@ "version": "8.2.3", "resolved": "https://registry.npmjs.org/ws/-/ws-8.2.3.tgz", "integrity": "sha512-wBuoj1BDpC6ZQ1B7DWQBYVLphPWkm8i9Y0/3YdHjHKHiohOJ1ws+3OccDWtH+PoC9DZD5WOTrJvNbWvjS6JWaA==", - "dev": true + "dev": true, + "requires": {} }, "y18n": { "version": "5.0.8", @@ -20564,8 +20515,7 @@ "yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "dev": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "yaml": { "version": "1.10.2", diff --git a/frontend/src/app/_data/Model.ts b/frontend/src/app/_data/Model.ts index 8a85e296..1af3fe30 100644 --- a/frontend/src/app/_data/Model.ts +++ b/frontend/src/app/_data/Model.ts @@ -73,7 +73,7 @@ export enum LossFunction { HingeLoss = 'hinge_loss', // multi-class classification loss functions CategoricalCrossEntropy = 'categorical_crossentropy', - SparseCategoricalCrossEntropy = 'sparse_categorical_crosentropy', + SparseCategoricalCrossEntropy = 'sparse_categorical_crossentropy', KLDivergence = 'kullback_leibler_divergence', // regression loss functions @@ -95,7 +95,7 @@ export enum LossFunctionBinaryClassification { } export enum LossFunctionMultiClassification { CategoricalCrossEntropy = 'categorical_crossentropy', - SparseCategoricalCrossEntropy = 'sparse_categorical_crosentropy', + SparseCategoricalCrossEntropy = 'sparse_categorical_crossentropy', KLDivergence = 'kullback_leibler_divergence', } -- cgit v1.2.3 From 1816cf8081f345c8e3374fcc5f0e2dbe4914f93d Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Sat, 16 Apr 2022 20:43:40 +0200 Subject: Izmenjeno uplodovanje h5 fajlova. --- backend/api/api/.gitignore | 1 + backend/api/api/Controllers/FileController.cs | 19 +++---------------- backend/api/api/api.csproj | 1 + 3 files changed, 5 insertions(+), 16 deletions(-) (limited to 'backend') diff --git a/backend/api/api/.gitignore b/backend/api/api/.gitignore index 17288e4c..3c45979c 100644 --- a/backend/api/api/.gitignore +++ b/backend/api/api/.gitignore @@ -4,6 +4,7 @@ ## Get latest from https://github.com/github/gitignore/blob/master/VisualStudio.gitignore ##Ignore contents for UploadedFiles Folder +PredictorFiles/* UploadedFiles/* !UploadedFiles/Igrannonica TempFiles/* diff --git a/backend/api/api/Controllers/FileController.cs b/backend/api/api/Controllers/FileController.cs index d9494525..c4a14b9a 100644 --- a/backend/api/api/Controllers/FileController.cs +++ b/backend/api/api/Controllers/FileController.cs @@ -44,26 +44,13 @@ namespace api.Controllers } [HttpPost("h5")] - public async Task> H5Upload([FromForm] IFormFile file) + public async Task> H5Upload([FromForm] IFormFile file,[FromForm] string uploaderId) { //get username from jwtToken - string folderName; - - string uploaderId = getUserId(); + string folderName="PredictorFiles"; - if (uploaderId == null) - return BadRequest(); - - if (uploaderId == "") - { - folderName = "TempFiles"; - } - else - { - folderName = "UploadedFiles"; - } //Check filetype @@ -74,7 +61,7 @@ namespace api.Controllers { return BadRequest("Wrong file type"); } - var folderPath = Path.Combine(Directory.GetCurrentDirectory(), folderName, uploaderId); + var folderPath = Path.Combine(Directory.GetCurrentDirectory(), folderName,uploaderId); //Check Directory if (!Directory.Exists(folderPath)) { diff --git a/backend/api/api/api.csproj b/backend/api/api/api.csproj index 7275f67c..306761b4 100644 --- a/backend/api/api/api.csproj +++ b/backend/api/api/api.csproj @@ -21,6 +21,7 @@ + -- cgit v1.2.3 From 3a9bffc6da590fd1a98a0c885d608d40849cffd4 Mon Sep 17 00:00:00 2001 From: Ognjen Cirkovic Date: Sat, 16 Apr 2022 21:48:14 +0200 Subject: Updajtovana poruka koja se salje front end-u. --- backend/api/api/Controllers/ModelController.cs | 3 ++- backend/api/api/api.csproj | 2 +- 2 files changed, 3 insertions(+), 2 deletions(-) (limited to 'backend') diff --git a/backend/api/api/Controllers/ModelController.cs b/backend/api/api/Controllers/ModelController.cs index c31b24e1..04c072da 100644 --- a/backend/api/api/Controllers/ModelController.cs +++ b/backend/api/api/Controllers/ModelController.cs @@ -102,7 +102,7 @@ namespace api.Controllers var user = _userService.GetUserByUsername(model.username); if (ChatHub.CheckUser(user._id)) - await _ichat.Clients.Client(ChatHub.Users[user._id]).SendAsync("NotifyEpoch",info.ModelId,info.Stat,model.epochs); + await _ichat.Clients.Client(ChatHub.Users[user._id]).SendAsync("NotifyEpoch",model.name,info.ModelId,info.Stat,model.epochs,info.EpochNum); return Ok(); } @@ -256,6 +256,7 @@ namespace api.Controllers public class Epoch { public string ModelId { get; set; } + public int EpochNum { get; set; } public string Stat { get; set; } } } diff --git a/backend/api/api/api.csproj b/backend/api/api/api.csproj index 306761b4..3d245333 100644 --- a/backend/api/api/api.csproj +++ b/backend/api/api/api.csproj @@ -21,7 +21,7 @@ - + -- cgit v1.2.3 From 66c147bc3154e531cfc78591a7451d904122fc1f Mon Sep 17 00:00:00 2001 From: TAMARA JERINIC Date: Sat, 16 Apr 2022 21:52:40 +0200 Subject: Ispravljeno obaveštavanje backend-a o epohama. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/api/api/Controllers/FileController.cs | 2 +- backend/microservice/api/controller.py | 18 ++++++++++++++---- backend/microservice/api/newmlservice.py | 10 +++++----- 3 files changed, 20 insertions(+), 10 deletions(-) (limited to 'backend') diff --git a/backend/api/api/Controllers/FileController.cs b/backend/api/api/Controllers/FileController.cs index c4a14b9a..68d2ebed 100644 --- a/backend/api/api/Controllers/FileController.cs +++ b/backend/api/api/Controllers/FileController.cs @@ -84,7 +84,7 @@ namespace api.Controllers await file.CopyToAsync(stream); } FileModel fileModel = new FileModel(); - fileModel.type = "h5"; + fileModel.type = ".h5"; fileModel.path = fullPath; fileModel.uploaderId = uploaderId; fileModel.date = DateTime.Now.ToUniversalTime(); diff --git a/backend/microservice/api/controller.py b/backend/microservice/api/controller.py index 437690ee..f0f36907 100644 --- a/backend/microservice/api/controller.py +++ b/backend/microservice/api/controller.py @@ -1,4 +1,6 @@ +from cmath import log from dataclasses import dataclass +from distutils.command.upload import upload from gc import callbacks from xmlrpc.client import DateTime import flask @@ -31,16 +33,24 @@ class Predictor: class train_callback(tf.keras.callbacks.Callback): - def __init__(self, x_test, y_test): + def __init__(self, x_test, y_test,modelId): self.x_test = x_test self.y_test = y_test + self.modelId=modelId # def on_epoch_end(self, epoch, logs=None): - print(epoch) + #print('Evaluation: ', self.model.evaluate(self.x_test,self.y_test),"\n") + + #print(epoch) + + #print(logs) + #ml_socket.send(epoch) #file = request.files.get("file") url = config.api_url + "/Model/epoch" - requests.post(url, epoch).text + r=requests.post(url, json={"Stat":str(logs),"ModelId":str(self.modelId),"EpochNum":epoch}).text + + #print(r) #print('Evaluation: ', self.model.evaluate(self.x_test,self.y_test),"\n") #broj parametara zavisi od izabranih metrika loss je default @app.route('/train', methods = ['POST']) @@ -63,7 +73,7 @@ def train(): url = config.api_url + "/file/h5" files = {'file': open(filepath, 'rb')} - r=requests.post(url, files=files) + r=requests.post(url, files=files,data={"uploaderId":paramsExperiment['uploaderId']}) fileId=r.text predictor = Predictor( _id = "", diff --git a/backend/microservice/api/newmlservice.py b/backend/microservice/api/newmlservice.py index 585db480..a9bce3bb 100644 --- a/backend/microservice/api/newmlservice.py +++ b/backend/microservice/api/newmlservice.py @@ -252,7 +252,7 @@ def train(dataset, paramsModel,paramsExperiment,paramsDataset,callback): opt=tf.keras.optimizers.RMSprop(learning_rate=params['learningRate']) ###REGULARIZACIJA - #regularisation={'kernelType':'l1 ili l2 ili l1_l2','krenelRate':default=0.01 ili jedna od vrednosti(0.0001,0.001,0.1,1,2,3) ili neka koju je korisnik zadao,'biasType':'','biasRate':'','activityType','activityRate'} + #regularisation={'kernelType':'l1 ili l2 ili l1_l2','kernelRate':default=0.01 ili jedna od vrednosti(0.0001,0.001,0.1,1,2,3) ili neka koju je korisnik zadao,'biasType':'','biasRate':'','activityType','activityRate'} reg=params['regularisation'] ###Kernel @@ -279,7 +279,7 @@ def train(dataset, paramsModel,paramsExperiment,paramsDataset,callback): elif(reg['kernelType']=='l1l2'): activityreg=tf.keras.regularizers.l1_l2(l1=reg['activityRate'][0],l2=reg['activityRate'][1]) """ - filepath=os.path.join("temp/",paramsExperiment['_id']+"_"+paramsModel['_id']) + filepath=os.path.join("temp/",paramsExperiment['_id']+"_"+paramsModel['_id']+".h5") if(problem_type=='multi-klasifikacioni'): #print('multi') classifier=tf.keras.Sequential() @@ -294,7 +294,7 @@ def train(dataset, paramsModel,paramsExperiment,paramsDataset,callback): classifier.compile(loss =paramsModel["lossFunction"] , optimizer = paramsModel['optimizer'] , metrics =paramsModel['metrics']) - history=classifier.fit(x_train, y_train, epochs = paramsModel['epochs'],batch_size=paramsModel['batchSize']) + history=classifier.fit(x_train, y_train, epochs = paramsModel['epochs'],batch_size=paramsModel['batchSize'],callbacks=callback(x_test, y_test,paramsModel['_id'])) hist=history.history #plt.plot(hist['accuracy']) @@ -326,7 +326,7 @@ def train(dataset, paramsModel,paramsExperiment,paramsDataset,callback): classifier.compile(loss =paramsModel["lossFunction"] , optimizer = paramsModel['optimizer'] , metrics =paramsModel['metrics']) - history=classifier.fit(x_train, y_train, epochs = paramsModel['epochs'],batch_size=paramsModel['batchSize']) + history=classifier.fit(x_train, y_train, epochs = paramsModel['epochs'],batch_size=paramsModel['batchSize'],callbacks=callback(x_test, y_test,paramsModel['_id'])) hist=history.history y_pred=classifier.predict(x_test) y_pred=(y_pred>=0.5).astype('int') @@ -352,7 +352,7 @@ def train(dataset, paramsModel,paramsExperiment,paramsDataset,callback): classifier.compile(loss =paramsModel["lossFunction"] , optimizer = paramsModel['optimizer'] , metrics =paramsModel['metrics']) - history=classifier.fit(x_train, y_train, epochs = paramsModel['epochs'],batch_size=paramsModel['batchSize']) + history=classifier.fit(x_train, y_train, epochs = paramsModel['epochs'],batch_size=paramsModel['batchSize'],callbacks=callback(x_test, y_test,paramsModel['_id'])) hist=history.history y_pred=classifier.predict(x_test) #print(classifier.evaluate(x_test, y_test)) -- cgit v1.2.3 From 1849a275864cdd7d70e284127360fa211ad470d7 Mon Sep 17 00:00:00 2001 From: Nevena Bojovic Date: Sat, 16 Apr 2022 22:23:02 +0200 Subject: Dodat zahtev addPredictor. --- backend/microservice/api/controller.py | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) (limited to 'backend') diff --git a/backend/microservice/api/controller.py b/backend/microservice/api/controller.py index f0f36907..88e84624 100644 --- a/backend/microservice/api/controller.py +++ b/backend/microservice/api/controller.py @@ -75,6 +75,9 @@ def train(): files = {'file': open(filepath, 'rb')} r=requests.post(url, files=files,data={"uploaderId":paramsExperiment['uploaderId']}) fileId=r.text + m = [] + for attribute, value in result.items(): + m.append({"Name" : attribute, "JsonValue" : jsonify(value)}) predictor = Predictor( _id = "", username = paramsModel["username"], @@ -86,12 +89,12 @@ def train(): experimentId = paramsExperiment["_id"], modelId = paramsModel["_id"], h5FileId = fileId, - metrics=[] + metrics = m ) - - print(result) print(predictor) - return jsonify(result) + url = config.api_url + "/Predictor/add" + r = requests.post(url, json=predictor).text + return r @app.route('/predict', methods = ['POST']) def predict(): -- cgit v1.2.3 From 55b1ee5e4bd96510f8ed2505d157b655a1202a45 Mon Sep 17 00:00:00 2001 From: Danijel Anđelković Date: Sat, 16 Apr 2022 22:53:52 +0200 Subject: Ispravljen bug pri serijalizaciji i deserijalizaciji novog predictora. --- .gitignore | 1 + backend/api/api/Controllers/PredictorController.cs | 1 + backend/microservice/api/controller.py | 56 +++++++++++----------- 3 files changed, 29 insertions(+), 29 deletions(-) (limited to 'backend') diff --git a/.gitignore b/.gitignore index afaf09d3..247afbd9 100644 --- a/.gitignore +++ b/.gitignore @@ -9,3 +9,4 @@ backend/microservice/temp/ backend/microservice/api/__pycache__/ production/app/node_modules/ production/app/dist/ +backend/microservice/api/temp/ diff --git a/backend/api/api/Controllers/PredictorController.cs b/backend/api/api/Controllers/PredictorController.cs index 481334e9..64907dac 100644 --- a/backend/api/api/Controllers/PredictorController.cs +++ b/backend/api/api/Controllers/PredictorController.cs @@ -155,6 +155,7 @@ namespace api.Controllers public async Task> Post([FromBody] Predictor predictor) { var user=_userService.GetUserByUsername(predictor.username); + predictor.dateCreated = DateTime.Now.ToUniversalTime(); var model = _modelService.GetOneModel(predictor.modelId); if (model == null || user==null) return BadRequest("Model not found or user doesnt exist"); diff --git a/backend/microservice/api/controller.py b/backend/microservice/api/controller.py index 88e84624..e6515e7b 100644 --- a/backend/microservice/api/controller.py +++ b/backend/microservice/api/controller.py @@ -2,7 +2,6 @@ from cmath import log from dataclasses import dataclass from distutils.command.upload import upload from gc import callbacks -from xmlrpc.client import DateTime import flask from flask import request, jsonify import newmlservice @@ -11,25 +10,24 @@ import pandas as pd import json import requests import config -from datetime import datetime app = flask.Flask(__name__) app.config["DEBUG"] = True app.config["SERVER_NAME"] = config.hostIP -@dataclass -class Predictor: - _id : str - username: str - inputs : list - output : str - isPublic: bool - accessibleByLink: bool - dateCreated: DateTime - experimentId: str - modelId: str - h5FileId: str - metrics: list +#@dataclass +#class Predictor: +# _id : str + # username: str + # inputs : list + # output : str + # isPublic: bool + # accessibleByLink: bool + # dateCreated: DateTime + # experimentId: str + # modelId: str + # h5FileId: str + # metrics: list class train_callback(tf.keras.callbacks.Callback): @@ -77,23 +75,23 @@ def train(): fileId=r.text m = [] for attribute, value in result.items(): - m.append({"Name" : attribute, "JsonValue" : jsonify(value)}) - predictor = Predictor( - _id = "", - username = paramsModel["username"], - inputs = paramsExperiment["inputColumns"], - output = paramsExperiment["outputColumn"], - isPublic = False, - accessibleByLink = False, - dateCreated = datetime.now(), - experimentId = paramsExperiment["_id"], - modelId = paramsModel["_id"], - h5FileId = fileId, - metrics = m - ) + m.append({"Name" : attribute, "JsonValue" : value}) + predictor = { + "_id" : "", + "username" : paramsModel["username"], + "inputs" : paramsExperiment["inputColumns"], + "output" : paramsExperiment["outputColumn"], + "isPublic" : False, + "accessibleByLink" : False, + "experimentId" : paramsExperiment["_id"], + "modelId" : paramsModel["_id"], + "h5FileId" : fileId, + "metrics" : m + } print(predictor) url = config.api_url + "/Predictor/add" r = requests.post(url, json=predictor).text + print(r) return r @app.route('/predict', methods = ['POST']) -- cgit v1.2.3 From 84b53024a7e0b2c4a0ea34d559678301ad8ee750 Mon Sep 17 00:00:00 2001 From: Nevena Bojovic Date: Sun, 17 Apr 2022 20:36:34 +0200 Subject: Razlicita enkodiranja za kolone ML. --- backend/microservice/api/newmlservice.py | 85 +++++++++++++++++--------------- 1 file changed, 45 insertions(+), 40 deletions(-) (limited to 'backend') diff --git a/backend/microservice/api/newmlservice.py b/backend/microservice/api/newmlservice.py index a9bce3bb..9951c25f 100644 --- a/backend/microservice/api/newmlservice.py +++ b/backend/microservice/api/newmlservice.py @@ -156,48 +156,53 @@ def train(dataset, paramsModel,paramsExperiment,paramsDataset,callback): # ### Enkodiranje encoding=paramsExperiment["encoding"] - if(encoding=='label'): - encoder=LabelEncoder() - for col in data.columns: - if(data[col].dtype==np.object_): - data[col]=encoder.fit_transform(data[col]) + datafront=dataset.copy() + svekolone=datafront.columns + kategorijskekolone=datafront.select_dtypes(include=['object']).columns + for kolona in svekolone: + if(kolona in kategorijskekolone): + if(encoding=='label'): + encoder=LabelEncoder() + for col in data.columns: + if(data[col].dtype==np.object_): + data[col]=encoder.fit_transform(data[col]) - elif(encoding=='onehot'): - category_columns=[] - for col in data.columns: - if(data[col].dtype==np.object_): - category_columns.append(col) - data=pd.get_dummies(data, columns=category_columns, prefix=category_columns) - - elif(encoding=='ordinal'): - encoder = OrdinalEncoder() - for col in data.columns: - if(data[col].dtype==np.object_): - data[col]=encoder.fit_transform(data[col]) - - elif(encoding=='hashing'): - category_columns=[] - for col in data.columns: - if(data[col].dtype==np.object_): - category_columns.append(col) - encoder=ce.HashingEncoder(cols=category_columns, n_components=len(category_columns)) - encoder.fit_transform(data) - elif(encoding=='binary'): - category_columns=[] - for col in data.columns: - if(data[col].dtype==np.object_): - category_columns.append(col) - encoder=ce.BinaryEncoder(cols=category_columns, return_df=True) - encoder.fit_transform(data) - - elif(encoding=='baseN'): - category_columns=[] - for col in data.columns: - if(data[col].dtype==np.object_): - category_columns.append(col) - encoder=ce.BaseNEncoder(cols=category_columns, return_df=True, base=5) - encoder.fit_transform(data) + elif(encoding=='onehot'): + category_columns=[] + for col in data.columns: + if(data[col].dtype==np.object_): + category_columns.append(col) + data=pd.get_dummies(data, columns=category_columns, prefix=category_columns) + + elif(encoding=='ordinal'): + encoder = OrdinalEncoder() + for col in data.columns: + if(data[col].dtype==np.object_): + data[col]=encoder.fit_transform(data[col]) + + elif(encoding=='hashing'): + category_columns=[] + for col in data.columns: + if(data[col].dtype==np.object_): + category_columns.append(col) + encoder=ce.HashingEncoder(cols=category_columns, n_components=len(category_columns)) + encoder.fit_transform(data) + elif(encoding=='binary'): + category_columns=[] + for col in data.columns: + if(data[col].dtype==np.object_): + category_columns.append(col) + encoder=ce.BinaryEncoder(cols=category_columns, return_df=True) + encoder.fit_transform(data) + + elif(encoding=='baseN'): + category_columns=[] + for col in data.columns: + if(data[col].dtype==np.object_): + category_columns.append(col) + encoder=ce.BaseNEncoder(cols=category_columns, return_df=True, base=5) + encoder.fit_transform(data) # # Input - output # -- cgit v1.2.3 From c3cc4c680bed2d2d00743bc03e6dc01501f90e25 Mon Sep 17 00:00:00 2001 From: Ivan Ljubisavljevic Date: Sun, 17 Apr 2022 23:53:42 +0200 Subject: Izbacen username iz datasetova, modela, prediktora itd (sa beka i fronta) #71 --- backend/api/api/Controllers/DatasetController.cs | 76 +++++++++------------- backend/api/api/Controllers/ModelController.cs | 69 ++++++++------------ backend/api/api/Controllers/PredictorController.cs | 55 ++++++++-------- backend/api/api/Models/Dataset.cs | 2 +- backend/api/api/Models/Model.cs | 2 +- backend/api/api/Models/Predictor.cs | 2 +- backend/api/api/Services/DatasetService.cs | 28 ++++---- backend/api/api/Services/IDatasetService.cs | 12 ++-- backend/api/api/Services/IModelService.cs | 10 +-- backend/api/api/Services/IPredictorService.cs | 8 +-- backend/api/api/Services/MlConnectionService.cs | 2 +- backend/api/api/Services/ModelService.cs | 22 +++---- backend/api/api/Services/PredictorService.cs | 16 ++--- backend/api/api/Services/TempRemovalService.cs | 6 +- backend/api/api/Services/UserService.cs | 12 ++-- 15 files changed, 145 insertions(+), 177 deletions(-) (limited to 'backend') diff --git a/backend/api/api/Controllers/DatasetController.cs b/backend/api/api/Controllers/DatasetController.cs index add85aba..bdac9ed9 100644 --- a/backend/api/api/Controllers/DatasetController.cs +++ b/backend/api/api/Controllers/DatasetController.cs @@ -25,22 +25,23 @@ namespace api.Controllers _fileService = fileService; jwtToken = Token; } - public string getUsername() + + public string getUserId() { - string username; + string userId; var header = Request.Headers[HeaderNames.Authorization]; if (AuthenticationHeaderValue.TryParse(header, out var headerValue)) { var scheme = headerValue.Scheme; var parameter = headerValue.Parameter; - username = jwtToken.TokenToUsername(parameter); - if (username == null) + userId = jwtToken.TokenToId(parameter); + if (userId == null) return null; } else return null; - return username; + return userId; } // GET: api//mydatasets @@ -48,17 +49,17 @@ namespace api.Controllers [Authorize(Roles = "User,Guest")] public ActionResult> Get() { - string username = getUsername(); + string userId = getUserId(); - if (username == null) + if (userId == null) return BadRequest(); - if (username == "") + if (userId == "") return _datasetService.GetGuestDatasets(); //ako bude trebao ID, samo iz baze uzeti - return _datasetService.GetMyDatasets(username); + return _datasetService.GetMyDatasets(userId); } // GET: api//datesort/{ascdsc}/{latest} @@ -69,12 +70,12 @@ namespace api.Controllers [Authorize(Roles = "User")] public ActionResult> SortDatasets(bool ascdsc, int latest) { - string username = getUsername(); + string userId = getUserId(); - if (username == null) + if (userId == null) return BadRequest(); - List lista = _datasetService.SortDatasets(username, ascdsc, latest); + List lista = _datasetService.SortDatasets(userId, ascdsc, latest); if (latest == 0) return lista; @@ -100,14 +101,7 @@ namespace api.Controllers [Authorize(Roles = "User")] public ActionResult> Search(string name) { - string username = getUsername(); - - if (username == null) - return BadRequest(); - - //ako bude trebao ID, samo iz baze uzeti - - return _datasetService.SearchDatasets(name, username); + return _datasetService.SearchDatasets(name); } @@ -117,12 +111,12 @@ namespace api.Controllers [Authorize(Roles = "User")] public ActionResult Get(string name) { - string username = getUsername(); + string userId = getUserId(); - if (username == null) + if (userId == null) return BadRequest(); - var dataset = _datasetService.GetOneDataset(username, name); + var dataset = _datasetService.GetOneDataset(userId, name); if (dataset == null) return NotFound($"Dataset with name = {name} not found or dataset is not public or not preprocessed"); @@ -134,22 +128,12 @@ namespace api.Controllers [Authorize(Roles = "User,Guest")] public async Task> Post([FromBody] Dataset dataset) { - string uploaderId; - var header = Request.Headers[HeaderNames.Authorization]; - if (AuthenticationHeaderValue.TryParse(header, out var headerValue)) - { - var scheme = headerValue.Scheme; - var parameter = headerValue.Parameter; - uploaderId = jwtToken.TokenToId(parameter); - if (uploaderId == null) - return null; - } - else - return BadRequest(); + string uploaderId = getUserId(); + //da li ce preko tokena da se ubaci username ili front salje //dataset.username = usernameToken; //username = "" ako je GUEST DODAO - var existingDataset = _datasetService.GetOneDataset(dataset.username, dataset.name); + var existingDataset = _datasetService.GetOneDataset(dataset.uploaderId, dataset.name); if (existingDataset != null) return NotFound($"Dateset with name = {dataset.name} exisits"); @@ -169,20 +153,20 @@ namespace api.Controllers [Authorize(Roles = "User")] public ActionResult Put(string name, [FromBody] Dataset dataset) { - string username = getUsername(); + string uploaderId = getUserId(); - if (username == null) + if (uploaderId == null) return BadRequest(); - var existingDataset = _datasetService.GetOneDataset(username, name); + var existingDataset = _datasetService.GetOneDataset(uploaderId, name); //ne mora da se proverava if (existingDataset == null) - return NotFound($"Dataset with name = {name} or user with username = {username} not found"); + return NotFound($"Dataset with name = {name} or user with ID = {uploaderId} not found"); dataset.lastUpdated = DateTime.UtcNow; - _datasetService.Update(username, name, dataset); + _datasetService.Update(uploaderId, name, dataset); return Ok($"Dataset with name = {name} updated"); } @@ -192,17 +176,17 @@ namespace api.Controllers [Authorize(Roles = "User")] public ActionResult Delete(string name) { - string username = getUsername(); + string uploaderId = getUserId(); - if (username == null) + if (uploaderId == null) return BadRequest(); - var dataset = _datasetService.GetOneDataset(username, name); + var dataset = _datasetService.GetOneDataset(uploaderId, name); if (dataset == null) - return NotFound($"Dataset with name = {name} or user with username = {username} not found"); + return NotFound($"Dataset with name = {name} or user with ID = {uploaderId} not found"); - _datasetService.Delete(dataset.username, dataset.name); + _datasetService.Delete(dataset.uploaderId, dataset.name); return Ok($"Dataset with name = {name} deleted"); diff --git a/backend/api/api/Controllers/ModelController.cs b/backend/api/api/Controllers/ModelController.cs index 04c072da..1ec01ab8 100644 --- a/backend/api/api/Controllers/ModelController.cs +++ b/backend/api/api/Controllers/ModelController.cs @@ -56,23 +56,6 @@ namespace api.Controllers return uploaderId; } - public string getUsername() - { - string username; - var header = Request.Headers[HeaderNames.Authorization]; - if (AuthenticationHeaderValue.TryParse(header, out var headerValue)) - { - var scheme = headerValue.Scheme; - var parameter = headerValue.Parameter; - username = jwtToken.TokenToUsername(parameter); - if (username == null) - return null; - } - else - return null; - - return username; - } [HttpPost("trainModel")] [Authorize(Roles = "User,Guest")] @@ -81,16 +64,16 @@ namespace api.Controllers string experimentId = trainModelObject.ExperimentId; string modelId = trainModelObject.ModelId; - string uploaderId = getUserId(); + string userId = getUserId(); - if (uploaderId == null) + if (userId == null) return BadRequest(); var experiment=_experimentService.Get(experimentId); var dataset = _datasetService.GetOneDataset(experiment.datasetId); - var filepath = _fileService.GetFilePath(dataset.fileId, uploaderId); + var filepath = _fileService.GetFilePath(dataset.fileId, userId); var model = _modelService.GetOneModel(modelId); - _mlService.TrainModel(model,experiment,filepath,dataset,uploaderId);//To do Obavestiti korisnika kada se model istrenira + _mlService.TrainModel(model,experiment,filepath,dataset, userId);//To do Obavestiti korisnika kada se model istrenira return Ok(); } @@ -99,7 +82,7 @@ namespace api.Controllers { var model=_modelService.GetOneModel(info.ModelId); - var user = _userService.GetUserByUsername(model.username); + var user = _userService.GetUserByUsername(model.uploaderId); if (ChatHub.CheckUser(user._id)) await _ichat.Clients.Client(ChatHub.Users[user._id]).SendAsync("NotifyEpoch",model.name,info.ModelId,info.Stat,model.epochs,info.EpochNum); @@ -117,12 +100,12 @@ namespace api.Controllers [Authorize(Roles = "User")] public ActionResult> Get() { - string username = getUsername(); - - if (username == null) + string uploaderId = getUserId(); + + if (uploaderId == null) return BadRequest(); - return _modelService.GetMyModels(username); + return _modelService.GetMyModels(uploaderId); } // vraca svoj model prema nekom imenu @@ -131,12 +114,12 @@ namespace api.Controllers [Authorize(Roles = "User")] public ActionResult Get(string name) { - string username = getUsername(); + string userId = getUserId(); - if (username == null) + if (userId == null) return BadRequest(); - var model = _modelService.GetOneModel(username, name); + var model = _modelService.GetOneModel(userId, name); if (model == null) return NotFound($"Model with name = {name} not found"); @@ -155,14 +138,14 @@ namespace api.Controllers [Authorize(Roles = "User")] public ActionResult> GetLatestModels(int latest) { - string username = getUsername(); + string userId = getUserId(); - if (username == null) + if (userId == null) return BadRequest(); //ako bude trebao ID, samo iz baze uzeti - List lista = _modelService.GetLatestModels(username); + List lista = _modelService.GetLatestModels(userId); List novaLista = new List(); @@ -185,7 +168,7 @@ namespace api.Controllers /*if (_modelService.CheckHyperparameters(1, model.hiddenLayerNeurons, model.hiddenLayers, model.outputNeurons) == false) return BadRequest("Bad parameters!");*/ - var existingModel = _modelService.GetOneModel(model.username, model.name); + var existingModel = _modelService.GetOneModel(model.uploaderId, model.name); if (existingModel != null && !overwrite) return NotFound($"Model with name = {model.name} exisits"); @@ -209,18 +192,18 @@ namespace api.Controllers [Authorize(Roles = "User")] public ActionResult Put(string name, [FromBody] Model model) { - string username = getUsername(); + string userId = getUserId(); - if (username == null) + if (userId == null) return BadRequest(); - var existingModel = _modelService.GetOneModel(username, name); + var existingModel = _modelService.GetOneModel(userId, name); if (existingModel == null) - return NotFound($"Model with name = {name} or user with username = {username} not found"); + return NotFound($"Model with name = {name} or user with ID = {userId} not found"); - _modelService.Update(username, name, model); + _modelService.Update(userId, name, model); return NoContent(); } @@ -229,17 +212,17 @@ namespace api.Controllers [Authorize(Roles = "User")] public ActionResult Delete(string name) { - string username = getUsername(); + string userId = getUserId(); - if (username == null) + if (userId == null) return BadRequest(); - var model = _modelService.GetOneModel(username, name); + var model = _modelService.GetOneModel(userId, name); if (model == null) - return NotFound($"Model with name = {name} or user with username = {username} not found"); + return NotFound($"Model with name = {name} or user with ID = {userId} not found"); - _modelService.Delete(model.username, model.name); + _modelService.Delete(model.uploaderId, model.name); return Ok($"Model with name = {name} deleted"); diff --git a/backend/api/api/Controllers/PredictorController.cs b/backend/api/api/Controllers/PredictorController.cs index 64907dac..26fe8f1d 100644 --- a/backend/api/api/Controllers/PredictorController.cs +++ b/backend/api/api/Controllers/PredictorController.cs @@ -32,22 +32,22 @@ namespace api.Controllers _modelService = modelService; } - public string getUsername() + public string getUserId() { - string username; + string uploaderId; var header = Request.Headers[HeaderNames.Authorization]; if (AuthenticationHeaderValue.TryParse(header, out var headerValue)) { var scheme = headerValue.Scheme; var parameter = headerValue.Parameter; - username = jwtToken.TokenToUsername(parameter); - if (username == null) + uploaderId = jwtToken.TokenToId(parameter); + if (uploaderId == null) return null; } else return null; - return username; + return uploaderId; } // GET: api//mypredictors @@ -55,12 +55,12 @@ namespace api.Controllers [Authorize(Roles = "User")] public ActionResult> Get() { - string username = getUsername(); + string userId = getUserId(); - if (username == null) + if (userId == null) return BadRequest(); - return _predictorService.GetMyPredictors(username); + return _predictorService.GetMyPredictors(userId); } // GET: api//publicpredictors @@ -90,12 +90,12 @@ namespace api.Controllers [Authorize(Roles = "User,Guest")] public ActionResult GetPredictor(string id) { - string username = getUsername(); + string userId = getUserId(); - if (username == null) + if (userId == null) return BadRequest(); - Predictor predictor = _predictorService.GetPredictor(username, id); + Predictor predictor = _predictorService.GetPredictor(userId, id); if (predictor == null) return NotFound($"Predictor with id = {id} not found"); @@ -108,11 +108,12 @@ namespace api.Controllers [Authorize(Roles = "User")] public ActionResult Get(string id) { - string username = getUsername(); + string userId = getUserId(); - if (username == null) + if (userId == null) return BadRequest(); + //treba userId da se salje GetOnePredictor var predictor = _predictorService.GetOnePredictor(id); if (predictor == null) @@ -130,12 +131,12 @@ namespace api.Controllers [Authorize(Roles = "User")] public ActionResult> SortPredictors(bool ascdsc, int latest) { - string username = getUsername(); + string userId = getUserId(); - if (username == null) + if (userId == null) return BadRequest(); - List lista = _predictorService.SortPredictors(username, ascdsc, latest); + List lista = _predictorService.SortPredictors(userId, ascdsc, latest); if(latest == 0) return lista; @@ -154,7 +155,7 @@ namespace api.Controllers [HttpPost("add")] public async Task> Post([FromBody] Predictor predictor) { - var user=_userService.GetUserByUsername(predictor.username); + var user=_userService.GetUserById(predictor.uploaderId); predictor.dateCreated = DateTime.Now.ToUniversalTime(); var model = _modelService.GetOneModel(predictor.modelId); if (model == null || user==null) @@ -171,12 +172,12 @@ namespace api.Controllers [Authorize(Roles = "User,Guest")] public async Task UsePredictor(String id, [FromBody] PredictorColumns[] inputs) { - string username = getUsername(); + string userId = getUserId(); - if (username == null) + if (userId == null) return BadRequest(); - Predictor predictor = _predictorService.GetPredictor(username, id); + Predictor predictor = _predictorService.GetPredictor(userId, id); Experiment e = _experimentService.Get(predictor.experimentId); @@ -195,16 +196,16 @@ namespace api.Controllers [Authorize(Roles = "User")] public ActionResult Put(string id, [FromBody] Predictor predictor) { - string username = getUsername(); + string userId = getUserId(); - if (username == null) + if (userId == null) return BadRequest(); var existingPredictor = _predictorService.GetOnePredictor(id); //ne mora da se proverava if (existingPredictor == null) - return NotFound($"Predictor with id = {id} or user with username = {username} not found"); + return NotFound($"Predictor with id = {id} or user with ID = {userId} not found"); _predictorService.Update(id, predictor); @@ -216,17 +217,17 @@ namespace api.Controllers [Authorize(Roles = "User")] public ActionResult Delete(string id) { - string username = getUsername(); + string userId = getUserId(); - if (username == null) + if (userId == null) return BadRequest(); var predictor = _predictorService.GetOnePredictor(id); if (predictor == null) - return NotFound($"Predictor with id = {id} or user with username = {username} not found"); + return NotFound($"Predictor with id = {id} or user with ID = {userId} not found"); - _predictorService.Delete(id); + _predictorService.Delete(id, userId); return Ok($"Predictor with id = {id} deleted"); diff --git a/backend/api/api/Models/Dataset.cs b/backend/api/api/Models/Dataset.cs index 47814449..cc7185f0 100644 --- a/backend/api/api/Models/Dataset.cs +++ b/backend/api/api/Models/Dataset.cs @@ -7,7 +7,7 @@ namespace api.Models public class Dataset { public Dataset() { } - public string username { get; set; } + public string uploaderId { get; set; } [BsonId] [BsonRepresentation(BsonType.ObjectId)]//mongo data type to .net diff --git a/backend/api/api/Models/Model.cs b/backend/api/api/Models/Model.cs index 72ee093b..a9dbfbdd 100644 --- a/backend/api/api/Models/Model.cs +++ b/backend/api/api/Models/Model.cs @@ -9,7 +9,7 @@ namespace api.Models [BsonId] [BsonRepresentation(BsonType.ObjectId)]//mongo data type to .net public string _id { get; set; } - public string username { get; set; } + public string uploaderId { get; set; } public string name { get; set; } diff --git a/backend/api/api/Models/Predictor.cs b/backend/api/api/Models/Predictor.cs index 26371d2a..8608d766 100644 --- a/backend/api/api/Models/Predictor.cs +++ b/backend/api/api/Models/Predictor.cs @@ -9,7 +9,7 @@ namespace api.Models [BsonId] [BsonRepresentation(BsonType.ObjectId)]//mongo data type to .net public string _id { get; set; } - public string username { get; set; } + public string uploaderId { get; set; } //public string name { get; set; } //public string description { get; set; } public string[] inputs { get; set; } diff --git a/backend/api/api/Services/DatasetService.cs b/backend/api/api/Services/DatasetService.cs index 176ab424..33026687 100644 --- a/backend/api/api/Services/DatasetService.cs +++ b/backend/api/api/Services/DatasetService.cs @@ -14,7 +14,7 @@ namespace api.Services _dataset = database.GetCollection(settings.DatasetCollectionName); } - public List SearchDatasets(string name, string username) + public List SearchDatasets(string name) { return _dataset.Find(dataset => dataset.name == name && dataset.isPublic == true && dataset.isPreProcess).ToList(); } @@ -27,27 +27,27 @@ namespace api.Services } //brisanje odredjenog name-a - public void Delete(string username, string name) + public void Delete(string userId, string name) { - _dataset.DeleteOne(dataset => (dataset.username == username && dataset.name == name)); + _dataset.DeleteOne(dataset => (dataset.uploaderId == userId && dataset.name == name)); } - public List GetMyDatasets(string username) + public List GetMyDatasets(string userId) { - return _dataset.Find(dataset => dataset.username == username && dataset.isPreProcess).ToList(); + return _dataset.Find(dataset => dataset.uploaderId == userId && dataset.isPreProcess).ToList(); } public List GetGuestDatasets() { //Join Igranonica public datasetove sa svim temp uploadanim datasetovima - List datasets= _dataset.Find(dataset => dataset.username == "Igrannonica" && dataset.isPublic == true && dataset.isPreProcess).ToList(); - datasets.AddRange(_dataset.Find(dataset => dataset.username == "" && dataset.isPreProcess).ToList()); + List datasets= _dataset.Find(dataset => dataset.uploaderId == "Igrannonica" && dataset.isPublic == true && dataset.isPreProcess).ToList(); + datasets.AddRange(_dataset.Find(dataset => dataset.uploaderId == "" && dataset.isPreProcess).ToList()); return datasets; } //poslednji datasetovi - public List SortDatasets(string username, bool ascdsc, int latest) + public List SortDatasets(string userId, bool ascdsc, int latest) { - List list = _dataset.Find(dataset => dataset.username == username && dataset.isPreProcess).ToList(); + List list = _dataset.Find(dataset => dataset.uploaderId == userId && dataset.isPreProcess).ToList(); if(ascdsc) list = list.OrderBy(dataset => dataset.lastUpdated).ToList(); @@ -62,9 +62,9 @@ namespace api.Services return _dataset.Find(dataset => dataset.isPublic == true && dataset.isPreProcess).ToList(); } - public Dataset GetOneDataset(string username, string name) + public Dataset GetOneDataset(string userId, string name) { - return _dataset.Find(dataset => dataset.username == username && dataset.name == name && dataset.isPreProcess).FirstOrDefault(); + return _dataset.Find(dataset => dataset.uploaderId == userId && dataset.name == name && dataset.isPreProcess).FirstOrDefault(); } //odraditi za pretragu getOne @@ -74,9 +74,9 @@ namespace api.Services } //ako je potrebno da se zameni name ili ekstenzija - public void Update(string username, string name, Dataset dataset ) + public void Update(string userId, string name, Dataset dataset ) { - _dataset.ReplaceOne(dataset => dataset.username == username && dataset.name == name, dataset); + _dataset.ReplaceOne(dataset => dataset.uploaderId == userId && dataset.name == name, dataset); } public void Update(Dataset dataset) { @@ -85,7 +85,7 @@ namespace api.Services public string GetDatasetId(string fileId) { - Dataset dataset = _dataset.Find(dataset => dataset.fileId == fileId && dataset.username == "Igrannonica").FirstOrDefault(); + Dataset dataset = _dataset.Find(dataset => dataset.fileId == fileId && dataset.uploaderId == "Igrannonica").FirstOrDefault(); return dataset._id; } diff --git a/backend/api/api/Services/IDatasetService.cs b/backend/api/api/Services/IDatasetService.cs index c6138943..b700e87c 100644 --- a/backend/api/api/Services/IDatasetService.cs +++ b/backend/api/api/Services/IDatasetService.cs @@ -5,15 +5,15 @@ namespace api.Services { public interface IDatasetService { - Dataset GetOneDataset(string username, string name); + Dataset GetOneDataset(string userId, string name); Dataset GetOneDataset(string id); - List SearchDatasets(string name, string username); - List GetMyDatasets(string username); - List SortDatasets(string username, bool ascdsc, int latest); + List SearchDatasets(string name); + List GetMyDatasets(string userId); + List SortDatasets(string userId, bool ascdsc, int latest); List GetPublicDatasets(); Dataset Create(Dataset dataset); - void Update(string username, string name, Dataset dataset); - void Delete(string username, string name); + void Update(string userId, string name, Dataset dataset); + void Delete(string userId, string name); public List GetGuestDatasets(); public void Update(Dataset dataset); string GetDatasetId(string fileId); diff --git a/backend/api/api/Services/IModelService.cs b/backend/api/api/Services/IModelService.cs index e10b8f3b..bcb82e2d 100644 --- a/backend/api/api/Services/IModelService.cs +++ b/backend/api/api/Services/IModelService.cs @@ -5,16 +5,16 @@ namespace api.Services { public interface IModelService { - Model GetOneModel(string username, string name); + Model GetOneModel(string userId, string name); Model GetOneModel(string id); - List GetMyModels(string username); - List GetLatestModels(string username); + List GetMyModels(string userId); + List GetLatestModels(string userId); //List GetPublicModels(); Model Create(Model model); Model Replace(Model model); - void Update(string username, string name, Model model); + void Update(string userId, string name, Model model); public void Update(string id, Model model); - void Delete(string username, string name); + void Delete(string userId, string name); bool CheckHyperparameters(int inputNeurons, int hiddenLayerNeurons, int hiddenLayers, int outputNeurons); bool CheckDb(); } diff --git a/backend/api/api/Services/IPredictorService.cs b/backend/api/api/Services/IPredictorService.cs index 7c31215e..16f0432a 100644 --- a/backend/api/api/Services/IPredictorService.cs +++ b/backend/api/api/Services/IPredictorService.cs @@ -5,12 +5,12 @@ namespace api.Services public interface IPredictorService { Predictor Create(Predictor predictor); - void Delete(string id); - List GetMyPredictors(string username); + void Delete(string id, string userId); + List GetMyPredictors(string userId); Predictor GetOnePredictor(string id); - Predictor GetPredictor(string username, string id); + Predictor GetPredictor(string userId, string id); List GetPublicPredictors(); - List SortPredictors(string username, bool ascdsc, int latest); + List SortPredictors(string userId, bool ascdsc, int latest); void Update(string id, Predictor predictor); } } \ No newline at end of file diff --git a/backend/api/api/Services/MlConnectionService.cs b/backend/api/api/Services/MlConnectionService.cs index 22db0aea..17c0f8b8 100644 --- a/backend/api/api/Services/MlConnectionService.cs +++ b/backend/api/api/Services/MlConnectionService.cs @@ -67,7 +67,7 @@ namespace api.Services public async Task Predict(Predictor predictor, Experiment experiment, PredictorColumns[] inputs) { - string filePath = _fileService.GetFilePath(predictor.h5FileId, predictor.username); + string filePath = _fileService.GetFilePath(predictor.h5FileId, predictor.uploaderId); var request = new RestRequest("predict", Method.Post); request.AddParameter("predictor", JsonConvert.SerializeObject(predictor)); diff --git a/backend/api/api/Services/ModelService.cs b/backend/api/api/Services/ModelService.cs index c21844f7..d3ff9bf9 100644 --- a/backend/api/api/Services/ModelService.cs +++ b/backend/api/api/Services/ModelService.cs @@ -26,18 +26,18 @@ namespace api.Services return model; } - public void Delete(string username, string name) + public void Delete(string userId, string name) { - _model.DeleteOne(model => (model.username == username && model.name == name)); + _model.DeleteOne(model => (model.uploaderId == userId && model.name == name)); } - public List GetMyModels(string username) + public List GetMyModels(string userId) { - return _model.Find(model => model.username == username).ToList(); + return _model.Find(model => model.uploaderId == userId).ToList(); } - public List GetLatestModels(string username) + public List GetLatestModels(string userId) { - List list = _model.Find(model => model.username == username).ToList(); + List list = _model.Find(model => model.uploaderId == userId).ToList(); list = list.OrderByDescending(model => model.lastUpdated).ToList(); @@ -50,9 +50,9 @@ namespace api.Services return _model.Find(model => model.isPublic == true).ToList(); } */ - public Model GetOneModel(string username, string name) + public Model GetOneModel(string userId, string name) { - return _model.Find(model => model.username == username && model.name == name).FirstOrDefault(); + return _model.Find(model => model.uploaderId == userId && model.name == name).FirstOrDefault(); } public Model GetOneModel(string id) @@ -60,9 +60,9 @@ namespace api.Services return _model.Find(model => model._id == id).FirstOrDefault(); } - public void Update(string username, string name, Model model) + public void Update(string userId, string name, Model model) { - _model.ReplaceOne(model => model.username == username && model.name == name, model); + _model.ReplaceOne(model => model.uploaderId == userId && model.name == name, model); } public void Update(string id, Model model) { @@ -83,7 +83,7 @@ namespace api.Services public bool CheckDb() { Model? model = null; - model = _model.Find(model => model.username == "igrannonica").FirstOrDefault(); + model = _model.Find(model => model.uploaderId == "Igrannonica").FirstOrDefault(); if (model != null) return false; diff --git a/backend/api/api/Services/PredictorService.cs b/backend/api/api/Services/PredictorService.cs index 144248d4..756cc943 100644 --- a/backend/api/api/Services/PredictorService.cs +++ b/backend/api/api/Services/PredictorService.cs @@ -21,14 +21,14 @@ namespace api.Services return predictor; } - public void Delete(string id) + public void Delete(string id, string userId) { - _predictor.DeleteOne(predictor => (predictor._id == id)); + _predictor.DeleteOne(predictor => (predictor._id == id && predictor.uploaderId == userId)); } - public List GetMyPredictors(string username) + public List GetMyPredictors(string userId) { - return _predictor.Find(predictor => predictor.username == username).ToList(); + return _predictor.Find(predictor => predictor.uploaderId == userId).ToList(); } public Predictor GetOnePredictor(string id) @@ -36,15 +36,15 @@ namespace api.Services return _predictor.Find(predictor => predictor._id == id).FirstOrDefault(); } - public Predictor GetPredictor(string username, string id) + public Predictor GetPredictor(string userId, string id) { - return _predictor.Find(predictor => predictor._id == id && (predictor.username == username || predictor.isPublic == true)).FirstOrDefault(); + return _predictor.Find(predictor => predictor._id == id && (predictor.uploaderId == userId || predictor.isPublic == true)).FirstOrDefault(); } - public List SortPredictors(string username, bool ascdsc, int latest) + public List SortPredictors(string userId, bool ascdsc, int latest) { - List list = _predictor.Find(predictor => predictor.username == username).ToList(); + List list = _predictor.Find(predictor => predictor.uploaderId == userId).ToList(); if (ascdsc) list = list.OrderBy(predictor => predictor.dateCreated).ToList(); diff --git a/backend/api/api/Services/TempRemovalService.cs b/backend/api/api/Services/TempRemovalService.cs index e7f366a3..302ca974 100644 --- a/backend/api/api/Services/TempRemovalService.cs +++ b/backend/api/api/Services/TempRemovalService.cs @@ -27,7 +27,7 @@ namespace api.Services if ((DateTime.Now.ToUniversalTime() - file.date).TotalDays >= 1) { DeleteFile(file._id); - List datasets = _dataset.Find(dataset => dataset.fileId == file._id && dataset.username=="").ToList(); + List datasets = _dataset.Find(dataset => dataset.fileId == file._id && dataset.uploaderId=="").ToList(); foreach(var dataset in datasets) { DeleteDataset(dataset._id); @@ -37,7 +37,7 @@ namespace api.Services DeleteExperiment(experiment._id); foreach(var modelId in experiment.ModelIds) { - var delModel=_model.Find(model=> modelId== model._id && model.username=="").FirstOrDefault(); + var delModel=_model.Find(model=> modelId== model._id && model.uploaderId=="").FirstOrDefault(); if(delModel!= null) DeleteModel(delModel._id); } @@ -48,7 +48,7 @@ namespace api.Services } } //Brisanje modela ukoliko gost koristi vec postojeci dataset - List models1= _model.Find(model =>model.username == "").ToList(); + List models1= _model.Find(model =>model.uploaderId == "").ToList(); foreach(var model in models1) { if ((DateTime.Now.ToUniversalTime() - model.dateCreated.ToUniversalTime()).TotalDays >= 1) diff --git a/backend/api/api/Services/UserService.cs b/backend/api/api/Services/UserService.cs index 7fc4bdb1..b53f5fdc 100644 --- a/backend/api/api/Services/UserService.cs +++ b/backend/api/api/Services/UserService.cs @@ -51,17 +51,17 @@ namespace api.Services using (var session = _client.StartSession()) { if(username!=user.Username) - if(_users.Find(u => u.Username == user.Username).FirstOrDefault()!=null) - { - return false; - } + if(_users.Find(u => u.Username == user.Username).FirstOrDefault()!=null) + { + return false; + } //Trenutan MongoDB Server ne podrzava transakcije.Omoguciti Podrsku //session.StartTransaction(); try { _users.ReplaceOne(user => user.Username == username, user); - if (username != user.Username) + /*if (username != user.Username) { var builderModel = Builders.Update; var builderDataset = Builders.Update; @@ -70,7 +70,7 @@ namespace api.Services _datasets.UpdateMany(x => x.username == username, builderDataset.Set(x => x.username, user.Username)); _predictors.UpdateMany(x => x.username == username, builderPredictor.Set(x => x.username, user.Username)); } - + */ //session.AbortTransaction(); -- cgit v1.2.3 From 208394ff08cba0880746d9c7841be08e127f66d6 Mon Sep 17 00:00:00 2001 From: Ivan Ljubisavljevic Date: Mon, 18 Apr 2022 01:14:31 +0200 Subject: Izmena na frontu i ml-u(username -> userId) #71 --- backend/api/api/Controllers/DatasetController.cs | 24 +++++++++++----------- backend/api/api/Controllers/ModelController.cs | 2 +- backend/api/api/Controllers/PredictorController.cs | 2 +- backend/api/api/Services/DatasetService.cs | 12 +++++------ backend/api/api/Services/IDatasetService.cs | 6 +++--- backend/microservice/api/controller.py | 2 +- frontend/src/app/_data/Dataset.ts | 2 +- frontend/src/app/_data/Model.ts | 2 +- frontend/src/app/_data/Predictor.ts | 3 ++- .../add-new-dataset/add-new-dataset.component.ts | 2 +- .../_elements/model-load/model-load.component.ts | 2 +- .../filter-datasets/filter-datasets.component.ts | 2 +- .../app/_pages/my-models/my-models.component.html | 2 +- .../app/_pages/my-models/my-models.component.ts | 8 +++++++- frontend/src/app/_services/datasets.service.ts | 4 ++-- frontend/src/app/_services/predictors.service.ts | 2 +- 16 files changed, 42 insertions(+), 35 deletions(-) (limited to 'backend') diff --git a/backend/api/api/Controllers/DatasetController.cs b/backend/api/api/Controllers/DatasetController.cs index bdac9ed9..58a903eb 100644 --- a/backend/api/api/Controllers/DatasetController.cs +++ b/backend/api/api/Controllers/DatasetController.cs @@ -149,46 +149,46 @@ namespace api.Controllers // PUT api//{name} - [HttpPut("{name}")] + [HttpPut("{id}")] [Authorize(Roles = "User")] - public ActionResult Put(string name, [FromBody] Dataset dataset) + public ActionResult Put(string id, [FromBody] Dataset dataset) { string uploaderId = getUserId(); if (uploaderId == null) return BadRequest(); - var existingDataset = _datasetService.GetOneDataset(uploaderId, name); + var existingDataset = _datasetService.GetOneDataset(uploaderId, id); //ne mora da se proverava if (existingDataset == null) - return NotFound($"Dataset with name = {name} or user with ID = {uploaderId} not found"); + return NotFound($"Dataset with ID = {id} or user with ID = {uploaderId} not found"); dataset.lastUpdated = DateTime.UtcNow; - _datasetService.Update(uploaderId, name, dataset); + _datasetService.Update(uploaderId, id, dataset); - return Ok($"Dataset with name = {name} updated"); + return Ok($"Dataset with ID = {id} updated"); } // DELETE api//name - [HttpDelete("{name}")] + [HttpDelete("{id}")] [Authorize(Roles = "User")] - public ActionResult Delete(string name) + public ActionResult Delete(string id) { string uploaderId = getUserId(); if (uploaderId == null) return BadRequest(); - var dataset = _datasetService.GetOneDataset(uploaderId, name); + var dataset = _datasetService.GetOneDataset(uploaderId, id); if (dataset == null) - return NotFound($"Dataset with name = {name} or user with ID = {uploaderId} not found"); + return NotFound($"Dataset with ID = {id} or user with ID = {uploaderId} not found"); - _datasetService.Delete(dataset.uploaderId, dataset.name); + _datasetService.Delete(dataset.uploaderId, dataset._id); - return Ok($"Dataset with name = {name} deleted"); + return Ok($"Dataset with ID = {id} deleted"); } } diff --git a/backend/api/api/Controllers/ModelController.cs b/backend/api/api/Controllers/ModelController.cs index 1ec01ab8..fe16507b 100644 --- a/backend/api/api/Controllers/ModelController.cs +++ b/backend/api/api/Controllers/ModelController.cs @@ -82,7 +82,7 @@ namespace api.Controllers { var model=_modelService.GetOneModel(info.ModelId); - var user = _userService.GetUserByUsername(model.uploaderId); + var user = _userService.GetUserById(model.uploaderId); if (ChatHub.CheckUser(user._id)) await _ichat.Clients.Client(ChatHub.Users[user._id]).SendAsync("NotifyEpoch",model.name,info.ModelId,info.Stat,model.epochs,info.EpochNum); diff --git a/backend/api/api/Controllers/PredictorController.cs b/backend/api/api/Controllers/PredictorController.cs index 26fe8f1d..dd5aa5fd 100644 --- a/backend/api/api/Controllers/PredictorController.cs +++ b/backend/api/api/Controllers/PredictorController.cs @@ -213,7 +213,7 @@ namespace api.Controllers } // DELETE api//name - [HttpDelete("{name}")] + [HttpDelete("{id}")] [Authorize(Roles = "User")] public ActionResult Delete(string id) { diff --git a/backend/api/api/Services/DatasetService.cs b/backend/api/api/Services/DatasetService.cs index 33026687..6c2efe14 100644 --- a/backend/api/api/Services/DatasetService.cs +++ b/backend/api/api/Services/DatasetService.cs @@ -27,9 +27,9 @@ namespace api.Services } //brisanje odredjenog name-a - public void Delete(string userId, string name) + public void Delete(string userId, string id) { - _dataset.DeleteOne(dataset => (dataset.uploaderId == userId && dataset.name == name)); + _dataset.DeleteOne(dataset => (dataset.uploaderId == userId && dataset._id == id)); } public List GetMyDatasets(string userId) @@ -62,9 +62,9 @@ namespace api.Services return _dataset.Find(dataset => dataset.isPublic == true && dataset.isPreProcess).ToList(); } - public Dataset GetOneDataset(string userId, string name) + public Dataset GetOneDataset(string userId, string id) { - return _dataset.Find(dataset => dataset.uploaderId == userId && dataset.name == name && dataset.isPreProcess).FirstOrDefault(); + return _dataset.Find(dataset => dataset.uploaderId == userId && dataset._id == id && dataset.isPreProcess).FirstOrDefault(); } //odraditi za pretragu getOne @@ -74,9 +74,9 @@ namespace api.Services } //ako je potrebno da se zameni name ili ekstenzija - public void Update(string userId, string name, Dataset dataset ) + public void Update(string userId, string id, Dataset dataset ) { - _dataset.ReplaceOne(dataset => dataset.uploaderId == userId && dataset.name == name, dataset); + _dataset.ReplaceOne(dataset => dataset.uploaderId == userId && dataset._id == id, dataset); } public void Update(Dataset dataset) { diff --git a/backend/api/api/Services/IDatasetService.cs b/backend/api/api/Services/IDatasetService.cs index b700e87c..bb06208d 100644 --- a/backend/api/api/Services/IDatasetService.cs +++ b/backend/api/api/Services/IDatasetService.cs @@ -5,15 +5,15 @@ namespace api.Services { public interface IDatasetService { - Dataset GetOneDataset(string userId, string name); + Dataset GetOneDataset(string userId, string id); Dataset GetOneDataset(string id); List SearchDatasets(string name); List GetMyDatasets(string userId); List SortDatasets(string userId, bool ascdsc, int latest); List GetPublicDatasets(); Dataset Create(Dataset dataset); - void Update(string userId, string name, Dataset dataset); - void Delete(string userId, string name); + void Update(string userId, string id, Dataset dataset); + void Delete(string userId, string id); public List GetGuestDatasets(); public void Update(Dataset dataset); string GetDatasetId(string fileId); diff --git a/backend/microservice/api/controller.py b/backend/microservice/api/controller.py index e6515e7b..9b83b8e7 100644 --- a/backend/microservice/api/controller.py +++ b/backend/microservice/api/controller.py @@ -78,7 +78,7 @@ def train(): m.append({"Name" : attribute, "JsonValue" : value}) predictor = { "_id" : "", - "username" : paramsModel["username"], + "uploaderId" : paramsModel["uploaderId"], "inputs" : paramsExperiment["inputColumns"], "output" : paramsExperiment["outputColumn"], "isPublic" : False, diff --git a/frontend/src/app/_data/Dataset.ts b/frontend/src/app/_data/Dataset.ts index 732d1c56..766040a3 100644 --- a/frontend/src/app/_data/Dataset.ts +++ b/frontend/src/app/_data/Dataset.ts @@ -10,7 +10,7 @@ export default class Dataset { public accessibleByLink: boolean = false, public dateCreated: Date = new Date(), public lastUpdated: Date = new Date(), - public username: string = '', + public uploaderId: string = '', public delimiter: string = '', public hasHeader: boolean = true, diff --git a/frontend/src/app/_data/Model.ts b/frontend/src/app/_data/Model.ts index 1af3fe30..b273f56a 100644 --- a/frontend/src/app/_data/Model.ts +++ b/frontend/src/app/_data/Model.ts @@ -19,7 +19,7 @@ export default class Model { public batchSize: number = 5, public hiddenLayerActivationFunctions: string[] = ['sigmoid'], public outputLayerActivationFunction: ActivationFunction = ActivationFunction.Sigmoid, - public username: string = '', + public uploaderId: string = '', public metrics: string[] = [], // TODO add to add-model form public epochs: number = 5 // TODO add to add-model form ) { } diff --git a/frontend/src/app/_data/Predictor.ts b/frontend/src/app/_data/Predictor.ts index 7e902eae..8aa2b6cb 100644 --- a/frontend/src/app/_data/Predictor.ts +++ b/frontend/src/app/_data/Predictor.ts @@ -7,6 +7,7 @@ export default class Predictor { public output: string = '', public isPublic: boolean = false, public accessibleByLink: boolean = false, - public dateCreated: Date = new Date() + public dateCreated: Date = new Date(), + public uploaderId: string = '' ) { } } \ No newline at end of file diff --git a/frontend/src/app/_elements/add-new-dataset/add-new-dataset.component.ts b/frontend/src/app/_elements/add-new-dataset/add-new-dataset.component.ts index 6ff108ce..3e1b5c73 100644 --- a/frontend/src/app/_elements/add-new-dataset/add-new-dataset.component.ts +++ b/frontend/src/app/_elements/add-new-dataset/add-new-dataset.component.ts @@ -90,7 +90,7 @@ export class AddNewDatasetComponent { this.modelsService.uploadData(this.files[0]).subscribe((file) => { //console.log('ADD MODEL: STEP 2 - ADD DATASET WITH FILE ID ' + file._id); this.dataset.fileId = file._id; - this.dataset.username = shared.username; + this.dataset.uploaderId = shared.userId; this.datasetsService.addDataset(this.dataset).subscribe((dataset) => { this.newDatasetAdded.emit("added"); diff --git a/frontend/src/app/_elements/model-load/model-load.component.ts b/frontend/src/app/_elements/model-load/model-load.component.ts index 9bd81f95..dbca3d17 100644 --- a/frontend/src/app/_elements/model-load/model-load.component.ts +++ b/frontend/src/app/_elements/model-load/model-load.component.ts @@ -69,7 +69,7 @@ export class ModelLoadComponent implements OnInit { uploadModel() { this.getMetrics(); - this.newModel.username = Shared.username; + this.newModel.uploaderId = Shared.userId; this.modelsService.addModel(this.newModel).subscribe((response) => { Shared.openDialog('Model dodat', 'Model je uspešno dodat u bazu.'); diff --git a/frontend/src/app/_pages/filter-datasets/filter-datasets.component.ts b/frontend/src/app/_pages/filter-datasets/filter-datasets.component.ts index c83bf208..66b3755e 100644 --- a/frontend/src/app/_pages/filter-datasets/filter-datasets.component.ts +++ b/frontend/src/app/_pages/filter-datasets/filter-datasets.component.ts @@ -33,7 +33,7 @@ export class FilterDatasetsComponent implements OnInit { newDataset._id = ""; newDataset.isPublic = false; newDataset.lastUpdated = new Date(); - newDataset.username = decodedToken.name; + newDataset.uploaderId = decodedToken.uploaderId; let name=prompt("Unesite naziv dataset-a",newDataset.name); newDataset.name=name as string; if(name!=null && name!="") diff --git a/frontend/src/app/_pages/my-models/my-models.component.html b/frontend/src/app/_pages/my-models/my-models.component.html index b0e9c4ef..9b281239 100644 --- a/frontend/src/app/_pages/my-models/my-models.component.html +++ b/frontend/src/app/_pages/my-models/my-models.component.html @@ -15,7 +15,7 @@