using System.Data; namespace brecal.model { public class User : DbEntity { #region Properties public string? Firstname { get; set; } public string? Lastname { get; set; } public string Username { get; set; } = ""; public string? PasswordHash { get; set; } public string? APIKey { get; set; } public uint? Participant_Id { get; set; } #endregion #region public static methods public static async Task> LoadForParticipant(Participant? p, IDBManager manager) { List loadResultList = await manager.Load(SetLoadQuery, LoadElems, args: p); List result = new(); foreach (User u in loadResultList.Cast()) result.Add(u); return result; } public static void SetLoadQuery(IDbCommand cmd, params object?[] args) { cmd.CommandText = "SELECT id, first_name, last_name, user_name, api_key, created, modified FROM user WHERE participant_id = @PID"; if (args.Length != 1 || !(args[0] is Participant)) throw new ArgumentException("loader needs single partipant as argument"); IDataParameter pid = cmd.CreateParameter(); pid.ParameterName = "PID"; if (args[0] is Participant p) pid.Value = p.Id; cmd.Parameters.Add(pid); } public static List LoadElems(IDataReader reader) { List result = new List(); while (reader.Read()) { User u = new(); u.Id = (uint)reader.GetInt32(0); if (!reader.IsDBNull(1)) u.Firstname = reader.GetString(1); if (!reader.IsDBNull(2)) u.Lastname = reader.GetString(2); if (!reader.IsDBNull(3)) u.Username = reader.GetString(3); if (!reader.IsDBNull(4)) u.APIKey = reader.GetString(4); if (!reader.IsDBNull(5)) u.Created = reader.GetDateTime(5); if (!reader.IsDBNull(6)) u.Modified = reader.GetDateTime(6); result.Add(u); } return result; } #endregion #region overrides public override void SetUpdate(IDbCommand cmd) { if(!string.IsNullOrEmpty(this.PasswordHash)) cmd.CommandText = "UPDATE user SET first_name = @FIRSTNAME, last_name = @LASTNAME, user_name = @USERNAME, password_hash = @PWHASH, api_key = @APIKEY WHERE id = @ID"; else cmd.CommandText = "UPDATE user SET first_name = @FIRSTNAME, last_name = @LASTNAME, user_name = @USERNAME, api_key = @APIKEY WHERE id = @ID"; this.SetParameters(cmd); } public override void SetCreate(IDbCommand cmd) { cmd.CommandText = "INSERT INTO user (participant_id, first_name, last_name, user_name, password_hash, api_key) VALUES ( @PID, @FIRSTNAME, @LASTNAME, @USERNAME, @PWHASH, @APIKEY)"; this.SetParameters(cmd); } public override void SetDelete(IDbCommand cmd) { cmd.CommandText = "DELETE FROM user WHERE id = @ID"; IDataParameter idParam = cmd.CreateParameter(); idParam.ParameterName = "ID"; idParam.Value = this.Id; cmd.Parameters.Add(idParam); } public override string ToString() { return this.Username ?? $"{base.Id} - {this.GetType().Name}"; } #endregion #region private methods private void SetParameters(IDbCommand cmd) { IDbDataParameter id = cmd.CreateParameter(); id.ParameterName = "ID"; id.Value = this.Id; cmd.Parameters.Add(id); IDbDataParameter pid = cmd.CreateParameter(); pid.ParameterName = "PID"; pid.Value = this.Participant_Id; cmd.Parameters.Add(pid); IDbDataParameter firstname = cmd.CreateParameter(); firstname.ParameterName = "FIRSTNAME"; firstname.Value = this.Firstname; cmd.Parameters.Add(firstname); IDbDataParameter lastname = cmd.CreateParameter(); lastname.ParameterName = "LASTNAME"; lastname.Value = this.Lastname; cmd.Parameters.Add(lastname); IDbDataParameter username = cmd.CreateParameter(); username.ParameterName = "USERNAME"; username.Value = this.Username; cmd.Parameters.Add(username); IDbDataParameter pwhash = cmd.CreateParameter(); pwhash.ParameterName = "PWHASH"; pwhash.Value = this.PasswordHash; cmd.Parameters.Add(pwhash); IDbDataParameter apikey = cmd.CreateParameter(); apikey.ParameterName = "APIKEY"; apikey.Value = this.APIKey; cmd.Parameters.Add(apikey); } #endregion } }