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 UpdateDevice(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(); } } }