using Microsoft.EntityFrameworkCore;
using Api.Models;
using Microsoft.AspNetCore.Mvc;
using static System.Runtime.InteropServices.JavaScript.JSType;
using Api.Models.Devices;
using Api.Models.Users;
using Microsoft.AspNetCore.Http.HttpResults;
using System.Collections.Generic;
//All EF Core database calls
namespace Api.DBAccess
{
public class DbAccess
{
private readonly DBContext _context;
public DbAccess(DBContext context)
{
_context = context;
}
///
/// Gets one user on id
///
/// used to get the specific user
/// returns a user object from the database based on the given id
public async Task ReadUser(int userId)
{
return await _context.Users.FirstOrDefaultAsync(u => u.Id == userId);
}
public async Task ReadUserDetails(int userId)
{
return await _context.Users
.Include(u => u.Devices)
.ThenInclude(u => u.Logs)
.FirstOrDefaultAsync(u => u.Id == userId);
}
// Returns a user according to refreshToken
public async Task ReadUserByRefreshToken(string refreshToken)
{
return await _context.Users.FirstOrDefaultAsync(u => u.RefreshToken == refreshToken);
}
///
/// Used to check both email and login for the login.
///
/// stores the input of username or email
/// returns a user object from the database based on the given email or username
public async Task ReadUserForLogin(string emailOrUsername)
{
if (emailOrUsername.Contains("@"))
{
return await _context.Users.FirstOrDefaultAsync(u => u.Email == emailOrUsername);
}
else
{
return await _context.Users.FirstOrDefaultAsync(u => u.UserName == emailOrUsername);
}
}
///
/// Gets all users
///
/// Return a list of users
public async Task> ReadAllUsers()
{
return await _context.Users.ToListAsync();
}
///
/// Creates a user
///
/// Need the entire user obj
/// returns true in a OkObjectResult and if there is some error it returns a ConflictObjectResult and a message that explain the reason
public async Task CreateUser(User user)
{
_context.Users.Add(user);
bool saved = await _context.SaveChangesAsync() == 1;
if (saved) { return new OkObjectResult(true); }
return new ConflictObjectResult(new { message = "Could not save to database" });
}
///
/// Updates the user in the database
///
/// Contains the updated user info
/// Has the id for the user that is to be updated
/// returns the updated user in a OkObjectResult and if there is some error it returns a ConflictObjectResult and a message that explain the reason
public async Task UpdateUser(User user)
{
_context.Entry(user).State = EntityState.Modified;
bool saved = await _context.SaveChangesAsync() == 1;
if (saved) { return new OkObjectResult(user);}
return new ConflictObjectResult(new { message = "Could not save to database" });
}
public async Task updatePassword(User user)
{
_context.Entry(user).State = EntityState.Modified;
bool saved = await _context.SaveChangesAsync() == 1;
if (saved) { return new OkObjectResult(user); }
return new ConflictObjectResult(new { message = "Could not save to database" });
}
///
/// Deletes a user from the database
///
/// The Id of the user that is to be deleted
/// returns true in a OkObjectResult and if there is some error it returns a ConflictObjectResult and a message that explain the reason
public async Task DeleteUser(User user)
{
_context.Users.Remove(user);
bool saved = await _context.SaveChangesAsync() >= 0;
if (saved) { return new OkObjectResult(saved); }
return new ConflictObjectResult(new { message = "Could not save to database" });
}
// Returns all devices
public List ReadDevices()
{
return _context.Devices.ToList();
}
// Returns a device according to deviceId
public async Task ReadDevice(int deviceId)
{
return await _context.Devices.FirstOrDefaultAsync(d => d.Id == deviceId);
}
// Returns a device according to referenceId
public Device ReadDevice(string referenceId)
{
return _context.Devices.FirstOrDefault(d => d.ReferenceId == referenceId);
}
///
/// Creates a user using entityframework core
///
/// The device that is going to be created
/// The user that owns the device
/// returns the true in a OkObjectResult and if there is some error it returns a ConflictObjectResult and a message that explain the reason
public async Task CreateDevice(User user)
{
_context.Entry(user).State = EntityState.Modified;
bool saved = await _context.SaveChangesAsync() == 2;
if (saved) { return new OkObjectResult(user.Id); }
return new ConflictObjectResult(new { message = "Could not save to database" });
}
///
/// Updates a device in the database
///
/// Contains the updated device info
/// Has the id for the device that is to be updated
/// returns the updated device in a OkObjectResult and if there is some error it returns a ConflictObjectResult and a message that explain the reason
public async Task EditDevice(Device device)
{
_context.Entry(device).State = EntityState.Modified;
bool saved = await _context.SaveChangesAsync() == 1;
if (saved) { return new OkObjectResult(device); }
return new ConflictObjectResult(new { message = "Could not save to database" });
}
public async Task DeleteDevice(Device device)
{
_context.Devices.Remove(device);
bool saved = await _context.SaveChangesAsync() >= 0;
if (saved) { return new OkObjectResult(saved); }
return new ConflictObjectResult(new { message = "Could not save to database" });
}
///
/// Returns the logs from the device
///
/// Has the id for the device that the los belong too
/// Return only logs within the specified datetime range
///
public async Task> ReadLogs(int deviceId, DateTimeRange range)
{
return _context.Devices.Include(d => d.Logs.Where(l => l.Date > range.DateTimeStart && l.Date < range.DateTimeEnd)).Where(d => d.Id == deviceId).FirstOrDefault().Logs;
}
///
/// Creates a new log
///
/// the new log
/// the referenceId that belongs too the device that recoded the log
public async void CreateLog(TemperatureLogs temperatureLogs, string referenceId)
{
var device = await _context.Devices.Include(d => d.Logs).FirstOrDefaultAsync(d => d.ReferenceId == referenceId);
if (device == null) { return; }
if (device.Logs == null) { device.Logs = new List(); }
device.Logs.Add(temperatureLogs);
await _context.SaveChangesAsync();
}
// Does a health check on the database access
public async Task Test()
{
return _context.Database.CanConnect();
}
}
}