added data access methods for user access.

This commit is contained in:
DESKTOP-GENO133\IvanPlex
2024-01-13 15:44:29 -07:00
parent 08104eef2a
commit 8f3f71772b
9 changed files with 147 additions and 3 deletions

8
Enum/UserAccessType.cs Normal file
View File

@@ -0,0 +1,8 @@
namespace CarCareTracker.Models
{
public enum UserAccessType
{
Viewer = 0,
Editor = 1
}
}

View File

@@ -0,0 +1,91 @@
using CarCareTracker.External.Interfaces;
using CarCareTracker.Helper;
using CarCareTracker.Models;
using LiteDB;
namespace CarCareTracker.External.Implementations
{
public class UserAccessDataAccess : IUserAccessDataAccess
{
private static string dbName = StaticHelper.DbName;
private static string tableName = "useraccessrecords";
public UserAccess GetUserAccessByVehicleAndUserId(int vehicleId, int userId)
{
using (var db = new LiteDatabase(dbName))
{
var table = db.GetCollection<UserAccess>(tableName);
return table.FindOne(Query.And(
Query.EQ(nameof(UserAccess.VehicleId), vehicleId),
Query.EQ(nameof(UserAccess.UserId), userId)
));
};
}
/// <summary>
/// Gets a list of vehicles user have access to.
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
public List<UserAccess> GetUserAccessByUserId(int userId)
{
using (var db = new LiteDatabase(dbName))
{
var table = db.GetCollection<UserAccess>(tableName);
return table.Find(Query.EQ(nameof(UserAccess.UserId), userId)).ToList();
};
}
public List<UserAccess> GetUserAccessByVehicleId(int vehicleId)
{
using (var db = new LiteDatabase(dbName))
{
var table = db.GetCollection<UserAccess>(tableName);
return table.Find(Query.EQ(nameof(UserAccess.VehicleId), vehicleId)).ToList();
};
}
public bool SaveUserAccess(UserAccess userAccess)
{
using (var db = new LiteDatabase(dbName))
{
var table = db.GetCollection<UserAccess>(tableName);
table.Upsert(userAccess);
return true;
};
}
public bool DeleteUserAccess(int userAccessId)
{
using (var db = new LiteDatabase(dbName))
{
var table = db.GetCollection<UserAccess>(tableName);
table.Delete(userAccessId);
return true;
};
}
/// <summary>
/// Delete all access records when a vehicle is deleted.
/// </summary>
/// <param name="vehicleId"></param>
/// <returns></returns>
public bool DeleteAllAccessRecordsByVehicleId(int vehicleId)
{
using (var db = new LiteDatabase(dbName))
{
var table = db.GetCollection<UserAccess>(tableName);
table.DeleteMany(Query.EQ(nameof(UserAccess.VehicleId), vehicleId));
return true;
};
}
/// <summary>
/// Delee all access records when a user is deleted.
/// </summary>
/// <param name="userId"></param>
/// <returns></returns>
public bool DeleteAllAccessRecordsByUserId(int userId)
{
using (var db = new LiteDatabase(dbName))
{
var table = db.GetCollection<UserAccess>(tableName);
table.DeleteMany(Query.EQ(nameof(UserAccess.UserId), userId));
return true;
};
}
}
}

View File

@@ -14,10 +14,18 @@ namespace CarCareTracker.External.Implementations
using (var db = new LiteDatabase(dbName))
{
var table = db.GetCollection<Vehicle>(tableName);
table.Upsert(vehicle);
var result = table.Upsert(vehicle);
return true;
};
}
public Vehicle GetLastInsertedVehicle()
{
using (var db = new LiteDatabase(dbName))
{
var table = db.GetCollection<Vehicle>(tableName);
return table.FindOne(Query.All(Query.Descending));
};
}
public bool DeleteVehicle(int vehicleId)
{
using (var db = new LiteDatabase(dbName))

View File

@@ -0,0 +1,15 @@
using CarCareTracker.Models;
namespace CarCareTracker.External.Interfaces
{
public interface IUserAccessDataAccess
{
UserAccess GetUserAccessByVehicleAndUserId(int vehicleId, int userId);
List<UserAccess> GetUserAccessByUserId(int userId);
List<UserAccess> GetUserAccessByVehicleId(int vehicleId);
bool SaveUserAccess(UserAccess userAccess);
bool DeleteUserAccess(int userAccessId);
bool DeleteAllAccessRecordsByVehicleId(int vehicleId);
bool DeleteAllAccessRecordsByUserId(int userId);
}
}

View File

@@ -5,6 +5,7 @@ namespace CarCareTracker.External.Interfaces
public interface IVehicleDataAccess
{
public bool SaveVehicle(Vehicle vehicle);
public Vehicle GetLastInsertedVehicle();
public bool DeleteVehicle(int vehicleId);
public List<Vehicle> GetVehicles();
public Vehicle GetVehicleById(int vehicleId);

View File

@@ -39,7 +39,8 @@ namespace CarCareTracker.Middleware
var appIdentity = new ClaimsIdentity("Custom");
var userIdentity = new List<Claim>
{
new(ClaimTypes.Name, "admin")
new(ClaimTypes.Name, "admin"),
new(ClaimTypes.Role, nameof(UserData.IsRootUser))
};
appIdentity.AddClaims(userIdentity);
AuthenticationTicket ticket = new AuthenticationTicket(new ClaimsPrincipal(appIdentity), this.Scheme.Name);
@@ -64,7 +65,8 @@ namespace CarCareTracker.Middleware
if (splitString.Count() != 2)
{
return AuthenticateResult.Fail("Invalid credentials");
} else
}
else
{
var userData = _loginLogic.ValidateUserCredentials(new LoginModel { UserName = splitString[0], Password = splitString[1] });
if (userData.Id != default)
@@ -78,6 +80,10 @@ namespace CarCareTracker.Middleware
{
userIdentity.Add(new(ClaimTypes.Role, nameof(UserData.IsAdmin)));
}
if (userData.IsRootUser)
{
userIdentity.Add(new(ClaimTypes.Role, nameof(UserData.IsRootUser)));
}
appIdentity.AddClaims(userIdentity);
AuthenticationTicket ticket = new AuthenticationTicket(new ClaimsPrincipal(appIdentity), this.Scheme.Name);
return AuthenticateResult.Success(ticket);
@@ -114,6 +120,10 @@ namespace CarCareTracker.Middleware
{
userIdentity.Add(new(ClaimTypes.Role, nameof(UserData.IsAdmin)));
}
if (authCookie.UserData.IsRootUser)
{
userIdentity.Add(new(ClaimTypes.Role, nameof(UserData.IsRootUser)));
}
appIdentity.AddClaims(userIdentity);
AuthenticationTicket ticket = new AuthenticationTicket(new ClaimsPrincipal(appIdentity), this.Scheme.Name);
return AuthenticateResult.Success(ticket);

10
Models/User/UserAccess.cs Normal file
View File

@@ -0,0 +1,10 @@
namespace CarCareTracker.Models
{
public class UserAccess
{
public int Id { get; set; }
public int UserId { get; set; }
public int VehicleId { get; set; }
public UserAccessType AccessType { get; set; }
}
}

View File

@@ -20,6 +20,7 @@ builder.Services.AddSingleton<IReminderRecordDataAccess, ReminderRecordDataAcces
builder.Services.AddSingleton<IUpgradeRecordDataAccess, UpgradeRecordDataAccess>();
builder.Services.AddSingleton<IUserRecordDataAccess, UserRecordDataAccess>();
builder.Services.AddSingleton<ITokenRecordDataAccess, TokenRecordDataAccess>();
builder.Services.AddSingleton<IUserAccessDataAccess, UserAccessDataAccess>();
//configure helpers
builder.Services.AddSingleton<IFileHelper, FileHelper>();