Add Provider controller.. Call a DBService in service is null.. Blocked.

This commit is contained in:
Thomas Fransolet 2020-03-28 19:01:41 +01:00
parent 8960953ccc
commit f35c89f861
18 changed files with 287 additions and 56 deletions

View File

@ -114,13 +114,14 @@ namespace MyCore.Controllers.Devices
{ {
try try
{ {
if (providerId == null)
throw new KeyNotFoundException("Provider id is null");
if (userId == null && UserService.IsExist(userId)) if (userId == null && UserService.IsExist(userId))
throw new KeyNotFoundException("User not found"); throw new KeyNotFoundException("User not found");
List<DeviceDetailDTO> devicesCreated = DeviceService.CreateFromProvider(providerId); Provider provider = ProviderService.GetProviderById(userId, providerId);
if (provider != null)
throw new KeyNotFoundException("Provider id is null");
List<DeviceDetailDTO> devicesCreated = DeviceService.CreateFromProvider(provider);
return new OkObjectResult(devicesCreated); return new OkObjectResult(devicesCreated);
@ -147,7 +148,7 @@ namespace MyCore.Controllers.Devices
try try
{ {
if (!_DeviceDatabaseService.IsExist(deviceId)) if (!_DeviceDatabaseService.IsExist(deviceId))
throw new KeyNotFoundException("Location does not exist"); throw new KeyNotFoundException("Device does not exist");
DeviceDetailDTO deviceUpdated = DeviceService.CreateOrUpdate(deviceDetailDTO, false); DeviceDetailDTO deviceUpdated = DeviceService.CreateOrUpdate(deviceDetailDTO, false);

View File

@ -0,0 +1,134 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using MongoDB.Bson;
using MyCore.DTO.Common;
using MyCore.DTO.MyControlPanel;
using MyCore.Models;
using MyCore.Models.MyControlPanel;
using MyCore.Services;
using MyCore.Services.Devices;
using MyCore.Services.MyControlPanel;
namespace MyCore.Controllers.Devices
{
//[Authorize(Roles = "Admin")]
[Authorize]
[Route("api/provider")]
[ApiController]
public class ProviderController : ControllerBase
{
// GET: Devices
/// <summary>
/// Get all user providers
/// </summary>
[ProducesResponseType(typeof(List<ProviderDTO>), 200)]
[HttpGet]
public ObjectResult GetAll(string userId)
{
try
{
List<Provider> providers = ProviderService.GetAll(userId);
List<ProviderDTO> providersDTO = providers.Select(p => p.ToDTO()).ToList();
return new OkObjectResult(providersDTO);
}
catch (Exception ex)
{
return new ObjectResult(ex.Message) { StatusCode = 500 };
}
}
/// <summary>
/// Create a provider
/// </summary>
/// <param name="userId">User Id</param>
/// <param name="providerDTO">Provider to create</param>
[ProducesResponseType(typeof(ProviderDTO), 200)]
[HttpPost]
public ObjectResult Create(string userId, [FromBody] ProviderDTO providerDTO)
{
try
{
if (userId == null && UserService.IsExist(userId))
throw new KeyNotFoundException("User not found");
if (providerDTO == null)
throw new KeyNotFoundException("Provider is null");
ProviderDTO providerCreated = ProviderService.CreateOrUpdate(userId, providerDTO, true);
return new OkObjectResult(providerCreated);
}
catch (KeyNotFoundException ex)
{
return new BadRequestObjectResult(ex.Message) { StatusCode = 404 };
}
catch (Exception ex)
{
return new ObjectResult(ex.Message) { StatusCode = 500 };
}
}
/// <summary>
/// Update a provider
/// </summary>
/// <param name="userId">User Id</param>
/// <param name="providerDTO">Provider to update</param>
[ProducesResponseType(typeof(DeviceDetailDTO), 200)]
[HttpPut("{deviceId}")]
public ObjectResult Update(string userId, [FromBody] ProviderDTO providerDTO)
{
try
{
if (userId == null && UserService.IsExist(userId))
throw new KeyNotFoundException("User not found");
if (!ProviderService.IsExist(userId, providerDTO.Id))
throw new KeyNotFoundException("Provider does not exist");
ProviderDTO providerUpdated = ProviderService.CreateOrUpdate(userId, providerDTO, false);
return new OkObjectResult(providerUpdated);
}
catch (KeyNotFoundException ex)
{
return new BadRequestObjectResult(ex.Message) { StatusCode = 404 };
}
catch (Exception ex)
{
return new ObjectResult(ex.Message) { StatusCode = 500 };
}
}
/// <summary>
/// Delete a provider
/// </summary>
/// <param name="providerId">Id of provider to delete</param>
[HttpDelete("{providerId}")]
public ObjectResult Delete(string providerId)
{
try
{
// Check if exist
// TODO
// ProviderDatabaseService.Remove(providerId);
return new OkObjectResult(201);
}
catch (Exception ex)
{
return new ObjectResult(ex.Message) { StatusCode = 500 };
}
}
}
}

View File

@ -38,7 +38,7 @@ namespace MyCore.Controllers
if (IsValidUserAndPasswordCombination(tokenDTO.Email, tokenDTO.Password)) if (IsValidUserAndPasswordCombination(tokenDTO.Email, tokenDTO.Password))
{ {
UserInfo user = _userService.GetUserByEmail(tokenDTO.Email); UserInfo user = _userService.GetByEmail(tokenDTO.Email);
user.Token = _tokenService.GenerateToken(tokenDTO.Email).ToString(); user.Token = _tokenService.GenerateToken(tokenDTO.Email).ToString();
return user; return user;
@ -49,7 +49,7 @@ namespace MyCore.Controllers
private bool IsValidUserAndPasswordCombination(string email, string password) private bool IsValidUserAndPasswordCombination(string email, string password)
{ {
// Test if is database and is correct // Test if is database and is correct
List<UserInfo> users = _userService.GetUsers(); List<UserInfo> users = _userService.GetAll();
UserInfo user = users.Where(u => u.Email == email).FirstOrDefault(); UserInfo user = users.Where(u => u.Email == email).FirstOrDefault();

View File

@ -49,14 +49,14 @@ namespace MyCore.Controllers
{ {
if (id != null) if (id != null)
{ {
List<UserInfo> users = _userService.GetUsers(); List<UserInfo> users = _userService.GetAll();
if (!users.Select(u => u.Id).Contains(id)) if (!users.Select(u => u.Id).Contains(id))
{ {
return Conflict("This user was not found"); return Conflict("This user was not found");
} }
return _userService.GetUserById(id); return _userService.GetById(id);
} }
return StatusCode(500); return StatusCode(500);
} }
@ -74,14 +74,14 @@ namespace MyCore.Controllers
newUser.Token = _tokenService.GenerateToken(newUser.Email).ToString(); newUser.Token = _tokenService.GenerateToken(newUser.Email).ToString();
newUser.DateCreation = DateTime.Now; newUser.DateCreation = DateTime.Now;
List<UserInfo> users = _userService.GetUsers(); List<UserInfo> users = _userService.GetAll();
if (users.Select(u => u.Email).Contains(newUser.Email)) if (users.Select(u => u.Email).Contains(newUser.Email))
{ {
return Conflict("This Email is already used"); return Conflict("This Email is already used");
} }
UserInfo userCreated = _userService.CreateUser(newUser); UserInfo userCreated = _userService.Create(newUser);
return userCreated; return userCreated;
} }
@ -98,7 +98,7 @@ namespace MyCore.Controllers
{ {
if (updatedUser != null) if (updatedUser != null)
{ {
List<UserInfo> users = _userService.GetUsers(); List<UserInfo> users = _userService.GetAll();
if (!users.Select(u => u.Email).Contains(updatedUser.Email)) if (!users.Select(u => u.Email).Contains(updatedUser.Email))
{ {
@ -119,7 +119,7 @@ namespace MyCore.Controllers
{ {
if (id != null) if (id != null)
{ {
List<UserInfo> users = _userService.GetUsers(); List<UserInfo> users = _userService.GetAll();
if (!users.Select(u => u.Id).Contains(id)) if (!users.Select(u => u.Id).Contains(id))
{ {

View File

@ -9,6 +9,7 @@ namespace MyCore.DTO.MyControlPanel
{ {
public string Id { get; set; } public string Id { get; set; }
public string Name { get; set; } public string Name { get; set; }
public string UserId { get; set; }
public string Username { get; set; } public string Username { get; set; }
public string Password { get; set; } // TODO ENCRYPTED public string Password { get; set; } // TODO ENCRYPTED
public string ApiKey { get; set; } // TODO ENCRYPTED public string ApiKey { get; set; } // TODO ENCRYPTED

View File

@ -14,7 +14,6 @@ namespace MyCore.Models.MyControlPanel
/// </summary> /// </summary>
public class Device public class Device
{ {
private LocationDatabaseService _LocationDatabaseService;
[BsonId] [BsonId]
[BsonRepresentation(BsonType.ObjectId)] [BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; } public string Id { get; set; }
@ -71,7 +70,7 @@ namespace MyCore.Models.MyControlPanel
Id = Id, Id = Id,
Name = Name, Name = Name,
ConnectionStatus = ConnectionStatus, ConnectionStatus = ConnectionStatus,
Location = _LocationDatabaseService.GetById(LocationId).ToDTO(), // Check if correct way //Location = _LocationDatabaseService.GetById(LocationId).ToDTO(), // Check if correct way
Battery = Battery, Battery = Battery,
BatteryStatus = BatteryStatus BatteryStatus = BatteryStatus
}; };
@ -84,7 +83,7 @@ namespace MyCore.Models.MyControlPanel
Id = Id, Id = Id,
Name = Name, Name = Name,
ConnectionStatus = ConnectionStatus, ConnectionStatus = ConnectionStatus,
Location = _LocationDatabaseService.GetById(LocationId).ToDTO(), // Check if correct way //Location = _LocationDatabaseService.GetById(LocationId).ToDTO(), // Check if correct way
MeansOfCommunications = MeansOfCommunications, MeansOfCommunications = MeansOfCommunications,
CreatedDate = CreatedDate, CreatedDate = CreatedDate,
UpdatedDate = UpdatedDate, UpdatedDate = UpdatedDate,

View File

@ -16,6 +16,10 @@ namespace MyCore.Models.MyControlPanel
[BsonRepresentation(BsonType.ObjectId)] [BsonRepresentation(BsonType.ObjectId)]
public string Id { get; set; } public string Id { get; set; }
[BsonElement("UserId")]
[BsonRequired]
public string UserId { get; set; }
[BsonElement("Name")] [BsonElement("Name")]
[BsonRequired] [BsonRequired]
public string Name { get; set; } public string Name { get; set; }

View File

@ -81,12 +81,11 @@ namespace MyCore.Models
[BsonElement("Groups")] [BsonElement("Groups")]
public Group[] Groups { get; set; } public Group[] Groups { get; set; }
// TODO [BsonElement("ScreenConfigurationIds")]
/*[BsonElement("ScreenConfigurationIds")]
public ScreenConfiguration[] ScreenConfigurationIds { get; set; } public ScreenConfiguration[] ScreenConfigurationIds { get; set; }
[BsonElement("DeviceIds")] [BsonElement("DeviceIds")]
public ScreenDevice[] DeviceIds { get; set; }*/ public ScreenDevice[] DeviceIds { get; set; }
} }
} }

View File

@ -16,6 +16,13 @@ namespace MyCore.Services.Devices
private static ProviderDatabaseService _ProviderDatabaseService; private static ProviderDatabaseService _ProviderDatabaseService;
private static LocationDatabaseService _LocationDatabaseService; private static LocationDatabaseService _LocationDatabaseService;
public DeviceService(DeviceDatabaseService DeviceDatabaseService, ProviderDatabaseService ProviderDatabaseService, LocationDatabaseService LocationDatabaseService)
{
_DeviceDatabaseService = DeviceDatabaseService;
_ProviderDatabaseService = ProviderDatabaseService;
_LocationDatabaseService = LocationDatabaseService;
}
public static DeviceDetailDTO CreateOrUpdate(DeviceDetailDTO deviceDetailDTO, bool create) public static DeviceDetailDTO CreateOrUpdate(DeviceDetailDTO deviceDetailDTO, bool create)
{ {
Device device; Device device;
@ -55,27 +62,24 @@ namespace MyCore.Services.Devices
return _DeviceDatabaseService.Update(device.Id, device).ToDTO(); return _DeviceDatabaseService.Update(device.Id, device).ToDTO();
} }
public static List<DeviceDetailDTO> CreateFromProvider(string providerId) public static List<DeviceDetailDTO> CreateFromProvider(Provider provider)
{ {
// TODO !
Device device = new Device(); Device device = new Device();
Provider provider = new Provider(); if (!ProviderService.IsProviderSupported(provider.Name))
if (_ProviderDatabaseService.IsExist(providerId)) throw new KeyNotFoundException("Provider is not yet supported");
provider = _ProviderDatabaseService.GetById(providerId);
else
throw new KeyNotFoundException("Provider does not exist");
switch (provider.Name) switch (provider.Name)
{ {
case "Arlo": case "Arlo":
ArloService arloService = new ArloService(provider.Username, provider.Password);
break; break;
case "Meross": case "Meross":
break; break;
case "Yeelight": case "Yeelight":
break; break;
default:
throw new KeyNotFoundException("Provider is not yet supported");
} }
List<DeviceDetailDTO> createdDevice = new List<DeviceDetailDTO>(); List<DeviceDetailDTO> createdDevice = new List<DeviceDetailDTO>();

View File

@ -107,11 +107,13 @@ namespace MyCore.Services
LIBRARY LIBRARY
} }
public ArloService() public ArloService(string username, string password)
{ {
try try
{ {
/*_email = username;
_password = password;*/
// LOGIN // LOGIN
var loginTask = Task.Run(() => RequestURI(new Uri(_loginUrl), RequestType.Post, Request.LOGIN)); var loginTask = Task.Run(() => RequestURI(new Uri(_loginUrl), RequestType.Post, Request.LOGIN));
loginTask.Wait(); loginTask.Wait();
@ -122,28 +124,6 @@ namespace MyCore.Services
var data = ((JObject)JsonConvert.DeserializeObject(loginTask.Result))["data"]; var data = ((JObject)JsonConvert.DeserializeObject(loginTask.Result))["data"];
resultToken = JsonConvert.DeserializeObject<LoginResult>(data.ToString()); resultToken = JsonConvert.DeserializeObject<LoginResult>(data.ToString());
// GET DEVICE LIST
var deviceTask = Task.Run(() => RequestURI(new Uri(_userDevicesUrl), RequestType.Get, Request.DEVICES));
deviceTask.Wait();
if (deviceTask.Result != "")
{
data = ((JObject)JsonConvert.DeserializeObject(deviceTask.Result))["data"];
// RETRIEVE ALL ARLO DEVICES
allArloDevices = JsonConvert.DeserializeObject<List<ArloDevice>>(data.ToString());
}
// GET USER LIBRARY
var libraryTask = Task.Run(() => RequestURI(new Uri(_userLibraryUrl), RequestType.Post, Request.LIBRARY));
libraryTask.Wait();
if (libraryTask.Result != "")
{
data = ((JObject)JsonConvert.DeserializeObject(libraryTask.Result))["data"];
// RETRIEVE ALL DATA IN USER LIBRARY
allUserMedias = JsonConvert.DeserializeObject<List<UserMedia>>(data.ToString());
}
//SSE CONNEXION //SSE CONNEXION
ConnexionToSSE(); ConnexionToSSE();
} }
@ -207,6 +187,36 @@ namespace MyCore.Services
} }
} }
public List<ArloDevice> GetAllDevices() {
// GET DEVICE LIST
var deviceTask = Task.Run(() => RequestURI(new Uri(_userDevicesUrl), RequestType.Get, Request.DEVICES));
deviceTask.Wait();
if (deviceTask.Result != "")
{
var data = ((JObject)JsonConvert.DeserializeObject(deviceTask.Result))["data"];
// RETRIEVE ALL ARLO DEVICES
allArloDevices = JsonConvert.DeserializeObject<List<ArloDevice>>(data.ToString());
}
return allArloDevices;
}
public List<UserMedia> GetUserLibrary() {
// GET USER LIBRARY
var libraryTask = Task.Run(() => RequestURI(new Uri(_userLibraryUrl), RequestType.Post, Request.LIBRARY));
libraryTask.Wait();
if (libraryTask.Result != "")
{
var data = ((JObject)JsonConvert.DeserializeObject(libraryTask.Result))["data"];
// RETRIEVE ALL DATA IN USER LIBRARY
allUserMedias = JsonConvert.DeserializeObject<List<UserMedia>>(data.ToString());
}
return allUserMedias;
}
public void ConnexionToSSE() public void ConnexionToSSE()
{ {
/*var sseClient = new ServerEventsClient($"{_clientSubscribeUrl}?token={resultToken.token}", new string[] { "EventStream" }) /*var sseClient = new ServerEventsClient($"{_clientSubscribeUrl}?token={resultToken.token}", new string[] { "EventStream" })

View File

@ -18,14 +18,14 @@ namespace MyCore.Services.MyControlPanel
var database = client.GetDatabase("MyCoreDb"); var database = client.GetDatabase("MyCoreDb");
_Providers = database.GetCollection<Provider>("Providers"); _Providers = database.GetCollection<Provider>("Providers");
} }
public List<Provider> GetAll() public List<Provider> GetAll(string userId)
{ {
return _Providers.Find(p => true).ToList(); return _Providers.Find(p => p.UserId == userId).ToList();
} }
public Provider GetById(string id) public Provider GetById(string userId, string id)
{ {
return _Providers.Find<Provider>(p => p.Id == id).FirstOrDefault(); return _Providers.Find<Provider>(p => p.Id == id && p.UserId == userId).FirstOrDefault();
} }
public Provider GetByName(string name) public Provider GetByName(string name)

View File

@ -0,0 +1,79 @@
using Microsoft.Extensions.Configuration;
using MyCore.DTO.MyControlPanel;
using MyCore.Models.MyControlPanel;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace MyCore.Services.MyControlPanel
{
public class ProviderService
{
static List<string> supportedProviders = new List<string>() {
"Arlo",
"Meross",
"Yeelight",
"ZigBee"
};
private readonly ProviderDatabaseService _ProviderDatabaseService;
public ProviderService(ProviderDatabaseService ProviderDatabaseService)
{
_ProviderDatabaseService = ProviderDatabaseService;
}
public static bool IsExist(string userId, string providerId)
{
return _ProviderDatabaseService.GetById(userId, providerId) != null ? true : false;
}
public static List<Provider> GetAll(string userId)
{
return _ProviderDatabaseService.GetAll(userId);
}
public static ProviderDTO CreateOrUpdate(string userId, ProviderDTO providerDTO, bool create)
{
Provider provider;
if (create)
provider = new Provider();
else
{
provider = _ProviderDatabaseService.GetById(userId, providerDTO.Id);
}
if (!IsProviderSupported(providerDTO.Name))
throw new KeyNotFoundException("Provider is not yet supported");
provider.Name = providerDTO.Name;
provider.UserId = providerDTO.UserId;
provider.Username = providerDTO.Username;
provider.Password = providerDTO.Password;
provider.ApiKey = providerDTO.ApiKey;
if (create)
return _ProviderDatabaseService.Create(provider).ToDTO();
else
return _ProviderDatabaseService.Update(provider.Id, provider).ToDTO();
}
public static Provider GetProviderById(string userId, string providerId)
{
return _ProviderDatabaseService.GetById(userId, providerId);
}
// TODO Get supported services
public static List<string> GetSupportedProvider()
{
return supportedProviders;
}
public static bool IsProviderSupported(string providerName)
{
return supportedProviders.Contains(providerName) ? true : false;
}
}
}