diff --git a/Enum/UserAccessType.cs b/Enum/UserAccessType.cs new file mode 100644 index 0000000..4f61d58 --- /dev/null +++ b/Enum/UserAccessType.cs @@ -0,0 +1,8 @@ +namespace CarCareTracker.Models +{ + public enum UserAccessType + { + Viewer = 0, + Editor = 1 + } +} diff --git a/External/Implementations/UserAccessDataAcces.cs b/External/Implementations/UserAccessDataAcces.cs new file mode 100644 index 0000000..2f364cf --- /dev/null +++ b/External/Implementations/UserAccessDataAcces.cs @@ -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(tableName); + return table.FindOne(Query.And( + Query.EQ(nameof(UserAccess.VehicleId), vehicleId), + Query.EQ(nameof(UserAccess.UserId), userId) + )); + }; + } + /// + /// Gets a list of vehicles user have access to. + /// + /// + /// + public List GetUserAccessByUserId(int userId) + { + using (var db = new LiteDatabase(dbName)) + { + var table = db.GetCollection(tableName); + return table.Find(Query.EQ(nameof(UserAccess.UserId), userId)).ToList(); + }; + } + public List GetUserAccessByVehicleId(int vehicleId) + { + using (var db = new LiteDatabase(dbName)) + { + var table = db.GetCollection(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(tableName); + table.Upsert(userAccess); + return true; + }; + } + public bool DeleteUserAccess(int userAccessId) + { + using (var db = new LiteDatabase(dbName)) + { + var table = db.GetCollection(tableName); + table.Delete(userAccessId); + return true; + }; + } + /// + /// Delete all access records when a vehicle is deleted. + /// + /// + /// + public bool DeleteAllAccessRecordsByVehicleId(int vehicleId) + { + using (var db = new LiteDatabase(dbName)) + { + var table = db.GetCollection(tableName); + table.DeleteMany(Query.EQ(nameof(UserAccess.VehicleId), vehicleId)); + return true; + }; + } + /// + /// Delee all access records when a user is deleted. + /// + /// + /// + public bool DeleteAllAccessRecordsByUserId(int userId) + { + using (var db = new LiteDatabase(dbName)) + { + var table = db.GetCollection(tableName); + table.DeleteMany(Query.EQ(nameof(UserAccess.UserId), userId)); + return true; + }; + } + } +} \ No newline at end of file diff --git a/External/Implementations/VehicleDataAccess.cs b/External/Implementations/VehicleDataAccess.cs index e2cd45a..766ac47 100644 --- a/External/Implementations/VehicleDataAccess.cs +++ b/External/Implementations/VehicleDataAccess.cs @@ -14,10 +14,18 @@ namespace CarCareTracker.External.Implementations using (var db = new LiteDatabase(dbName)) { var table = db.GetCollection(tableName); - table.Upsert(vehicle); + var result = table.Upsert(vehicle); return true; }; } + public Vehicle GetLastInsertedVehicle() + { + using (var db = new LiteDatabase(dbName)) + { + var table = db.GetCollection(tableName); + return table.FindOne(Query.All(Query.Descending)); + }; + } public bool DeleteVehicle(int vehicleId) { using (var db = new LiteDatabase(dbName)) diff --git a/External/Interfaces/IUserAccessDataAccess.cs b/External/Interfaces/IUserAccessDataAccess.cs new file mode 100644 index 0000000..c242884 --- /dev/null +++ b/External/Interfaces/IUserAccessDataAccess.cs @@ -0,0 +1,15 @@ +using CarCareTracker.Models; + +namespace CarCareTracker.External.Interfaces +{ + public interface IUserAccessDataAccess + { + UserAccess GetUserAccessByVehicleAndUserId(int vehicleId, int userId); + List GetUserAccessByUserId(int userId); + List GetUserAccessByVehicleId(int vehicleId); + bool SaveUserAccess(UserAccess userAccess); + bool DeleteUserAccess(int userAccessId); + bool DeleteAllAccessRecordsByVehicleId(int vehicleId); + bool DeleteAllAccessRecordsByUserId(int userId); + } +} diff --git a/External/Interfaces/IVehicleDataAccess.cs b/External/Interfaces/IVehicleDataAccess.cs index f54118f..4a5ff42 100644 --- a/External/Interfaces/IVehicleDataAccess.cs +++ b/External/Interfaces/IVehicleDataAccess.cs @@ -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 GetVehicles(); public Vehicle GetVehicleById(int vehicleId); diff --git a/Middleware/Authen.cs b/Middleware/Authen.cs index 4639980..3d1cc6f 100644 --- a/Middleware/Authen.cs +++ b/Middleware/Authen.cs @@ -39,7 +39,8 @@ namespace CarCareTracker.Middleware var appIdentity = new ClaimsIdentity("Custom"); var userIdentity = new List { - 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); diff --git a/Models/User/UserAccess.cs b/Models/User/UserAccess.cs new file mode 100644 index 0000000..9940e0d --- /dev/null +++ b/Models/User/UserAccess.cs @@ -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; } + } +} diff --git a/Models/Login/UserData.cs b/Models/User/UserData.cs similarity index 100% rename from Models/Login/UserData.cs rename to Models/User/UserData.cs diff --git a/Program.cs b/Program.cs index f8597c5..2edb61f 100644 --- a/Program.cs +++ b/Program.cs @@ -20,6 +20,7 @@ builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); +builder.Services.AddSingleton(); //configure helpers builder.Services.AddSingleton();