using System.Data; namespace brecal.model { public class RoleAssignment : DbEntity { #region Properties public int? UserId { get; set; } public int? RoleId { get; set; } public Role? AssignedRole { get; set; } public User? AssignedUser { get; set; } #endregion #region public static methods public static async Task> LoadForUser(User? u, IDBManager manager) { List loadResultList = await manager.Load(SetLoadQuery, LoadElems, args: u); List result = new(); foreach (RoleAssignment ra in loadResultList.Cast()) { ra.AssignedUser = u; result.Add(ra); } return result; } public static void SetLoadQuery(IDbCommand cmd, params object?[] args) { cmd.CommandText = "SELECT id, user_id, role_id FROM user_role_map WHERE user_id = @UID"; if (args.Length != 1 || !(args[0] is User)) throw new ArgumentException("loader needs single user as argument"); IDataParameter uid = cmd.CreateParameter(); uid.ParameterName = "UID"; if (args[0] is User u) uid.Value = u.Id; cmd.Parameters.Add(uid); } public static List LoadElems(IDataReader reader) { List result = new List(); while (reader.Read()) { RoleAssignment ra = new(); ra.Id = (uint)reader.GetInt32(0); if (!reader.IsDBNull(1)) ra.UserId = reader.GetInt32(1); if (!reader.IsDBNull(2)) ra.RoleId = reader.GetInt32(2); result.Add(ra); } return result; } #endregion #region overrides public override void SetUpdate(IDbCommand cmd) { throw new NotImplementedException(); } public override void SetCreate(IDbCommand cmd) { cmd.CommandText = "INSERT INTO user_role_map (user_id, role_id) VALUES (@USERID, @ROLEID)"; IDbDataParameter userid = cmd.CreateParameter(); userid.ParameterName = "USERID"; userid.Value = this.UserId; cmd.Parameters.Add(userid); IDbDataParameter roleid = cmd.CreateParameter(); roleid.ParameterName = "ROLEID"; roleid.Value = this.RoleId; cmd.Parameters.Add(roleid); } public override void SetDelete(IDbCommand cmd) { cmd.CommandText = "DELETE FROM user_role_map WHERE id = @ID"; IDataParameter idParam = cmd.CreateParameter(); idParam.ParameterName = "ID"; idParam.Value = this.Id; cmd.Parameters.Add(idParam); } public override string ToString() { if (this.AssignedRole == null) { return $"{Id}: "; } else { return AssignedRole.Name ?? AssignedRole.Id.ToString(); } } #endregion } }