agper-perubahan/APIHandler.cs

234 lines
14 KiB
C#

using System.Text.Json;
using System.Text.RegularExpressions;
namespace perubahan;
public static partial class APIHandler
{
public static void Handle(IApplicationBuilder App)
{
App
//============MISC=================
.Map("/updatecache", cache =>
{
cache.Run(async runner =>
{
await UpdateCache();
await runner.WriteJsonResponse(StatusCodes.Status200OK, "Cache Updated.");
});
})
//===========UNITS=================
.Map("/getunits", units =>
{
units.Run(async runner =>
{
if (!await runner.RequestValidated(2)) return;
await runner.WriteJsonResponse(StatusCodes.Status200OK, "Success", Deployments);
});
})
.Map("/chunit", unit =>
{
unit.Run(async runner =>
{
if (!await runner.RequestValidated(2, "POST", true)) return;
if (await runner.TryGetBodyJsonAsync(["deplid", "unitkerja"], CTS.Token) is Dictionary<string, JsonElement> InElement)
{
Deployment CorrectDeployment = new(
InElement["deplid"].GetInt16(),
InElement["unitkerja"].GetString() ?? ""
);
if (CorrectDeployment.UnitKerja.Length < 1)
{
await runner.WriteJsonResponse(StatusCodes.Status400BadRequest, "Unit Kerja can't be empty string.");
return;
}
int i = Deployments.FindIndex(depl => depl.DeplID == CorrectDeployment.DeplID);
if (i < 0)
{
await runner.WriteJsonResponse(StatusCodes.Status404NotFound, "Deployment ID not found.");
return;
}
_ = await RunNonQueryAsync(CS, "UPDATE deployment SET unitkerja = @uk WHERE deplid = @id", Comm =>
{
Comm.Parameters.AddWithValue("@id", CorrectDeployment.DeplID);
Comm.Parameters.AddWithValue("@uk", CorrectDeployment.UnitKerja);
}, CTS.Token);
Deployments[i] = CorrectDeployment;
await runner.WriteJsonResponse(StatusCodes.Status202Accepted, "Data updated.", Deployments[i]);
}
});
})
.Map("/addunit", unit =>
{
unit.Run(async runner =>
{
if (!await runner.RequestValidated(2, "POST", true)) return;
if (await runner.TryGetBodyJsonAsync(["unitkerja"], CTS.Token) is Dictionary<string, JsonElement> InElement)
{
string UnitKerja = InElement["unitkerja"].GetString() ?? "";
if (UnitKerja.Length < 1)
{
await runner.WriteJsonResponse(StatusCodes.Status400BadRequest, "Unit Kerja can't be empty string.");
return;
}
short DeplID = (short)await RunScalarAsync(CS, "INSERT INTO deployment OUTPUT INSERTED.deplid VALUES (@uk)", Comm =>
{
Comm.Parameters.AddWithValue("@uk", UnitKerja);
}, CTS.Token);
Deployment Inserted = new(DeplID, UnitKerja);
Deployments.Add(Inserted);
// EventsMarker.CacheUpdates = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds().ToString("X");
await runner.WriteJsonResponse(StatusCodes.Status201Created, "Data Created.", Inserted);
}
});
})
//============AGENTS==============
.Map("/getagents", agents =>
{
agents.Run(async runner =>
{
if (!await runner.RequestValidated(2)) return;
await runner.WriteJsonResponse(StatusCodes.Status200OK, "Success", Agents);
});
})
.Map("/addagent", agent =>
{
agent.Run(async runner =>
{
if (!await runner.RequestValidated(1, "POST", true)) return;
if (await runner.TryGetBodyJsonAsync(["agentid", "name", "jabatan", "deplid", "skangkat", "tmt", "skper", "tgper", "vision", "mission", "photo", "createuser", "uname", "pass", "level"], CTS.Token) is Dictionary<string, JsonElement> InElement)
{
string AgentID = InElement["agentid"].GetString() ?? string.Empty;
string Name = InElement["name"].GetString() ?? string.Empty;
string Jabatan = InElement["jabatan"].GetString() ?? string.Empty;
short DeploymentID = InElement["deplid"].GetInt16();
string SKAngkat = InElement["skangkat"].GetString() ?? string.Empty;
DateOnly TMT = DateOnly.Parse(InElement["tmt"].GetString()?[..10] ?? "1970-01-01");
string SKPer = InElement["skper"].GetString() ?? string.Empty;
DateOnly? TGPer = InElement["tgper"].GetString()?.Length > 0 ? DateOnly.Parse(InElement["tgper"].GetString()![..10]) : null;
string Vision = InElement["vision"].GetString() ?? "-";
string Mission = InElement["mission"].GetString() ?? "-";
string Photo = InElement["photo"].GetString() ?? string.Empty;
string PhotoURL = string.Empty;
bool CreateUser = InElement["createuser"].GetBoolean();
string UName = InElement["uname"].GetString() ?? string.Empty;
string PlainPass = InElement["pass"].GetString() ?? string.Empty;
byte Level = InElement["level"].GetByte();
Match PhotoMatch = Base64Regex().Match(Photo.ToLower());
if (AgentID.Equals(string.Empty) ||
Name.Equals(string.Empty) ||
Jabatan.Equals(string.Empty) ||
//DeploymentID.Equals(0) ||
SKAngkat.Equals(string.Empty) ||
TMT.Equals(DateOnly.Parse("1970-01-01")) ||
(!SKPer.Equals(string.Empty) && TGPer is null) ||
(CreateUser && UName.Equals(string.Empty)) ||
(CreateUser && PlainPass.Equals(string.Empty)) ||
(!Photo.Equals(string.Empty) && !PhotoMatch.Success) ||
(!await runner.RequestValidated(Level, "POST"))
)
{
await runner.WriteJsonResponse(StatusCodes.Status400BadRequest, "One or more input(s) are not acceptable, in an unsupported format, or an attempt to create user account of a higher level than the creator is made.");
return;
}
if (!Photo.Equals(string.Empty))
{
string Format = PhotoMatch.Groups["format"].Value.ToLowerInvariant();
string Data = PhotoMatch.Groups["data"].Value;
byte[] ImageBytes = Convert.FromBase64String(Data);
uint CRC32Hash = Crc32.Compute(ImageBytes);
string PhotoFileName = $"{CRC32Hash:X8}.{(Format == "jpeg" ? "jpg" : Format)}";
string PhotoPath = Path.Combine(AppContext.BaseDirectory, "/wwwroot/assets/images/uploads", PhotoFileName);
if (!File.Exists(PhotoPath)) await File.WriteAllBytesAsync(PhotoPath, ImageBytes, CTS.Token);
PhotoURL = Path.Combine("/assets/images/uploads", PhotoFileName);
}
Agent NewAgent = new(AgentID, Name, Jabatan, DeploymentID, SKAngkat, TMT, SKPer.Length == 0 ? null : SKPer, SKPer.Length == 0 ? null : TGPer, Vision, Mission, Photo.Length == 0 ? null : PhotoURL);
await RunTransactionAsync(CS, async (Conn, Trans) =>
{
using (SqlCommand CreateAgent = Conn.CreateCommand())
{
CreateAgent.Transaction = Trans;
CreateAgent.CommandText = "INSERT INTO agents VALUES(@agid, @nama, @jabt, @deid, @skng, @tmt, @skpr, @tmpr, @visi, @misi, @poto)";
CreateAgent.Parameters.AddWithValue("@agid", AgentID);
CreateAgent.Parameters.AddWithValue("@nama", Name);
CreateAgent.Parameters.AddWithValue("@jabt", Jabatan);
CreateAgent.Parameters.AddWithValue("@deid", DeploymentID);
CreateAgent.Parameters.AddWithValue("@skng", SKAngkat);
CreateAgent.Parameters.AddWithValue("@tmt", TMT);
CreateAgent.Parameters.AddWithValue("@skpr", SKPer.Equals(string.Empty) ? DBNull.Value : SKPer);
CreateAgent.Parameters.AddWithValue("@tmpr", SKPer.Equals(string.Empty) ? DBNull.Value : TGPer);
CreateAgent.Parameters.AddWithValue("@visi", Vision);
CreateAgent.Parameters.AddWithValue("@misi", Mission);
CreateAgent.Parameters.AddWithValue("@poto", PhotoURL.Equals(string.Empty) ? DBNull.Value : PhotoURL);
_ = await CreateAgent.ExecuteNonQueryAsync();
}
if (CreateUser)
{
string HashedPass = Convert.ToHexString(SHA256.HashData(Encoding.UTF8.GetBytes(PlainPass)));
using (SqlCommand CreateUser = Conn.CreateCommand())
{
CreateUser.Transaction = Trans;
CreateUser.CommandText = "INSERT INTO useraccounts VALUES(@unam, @pass, @agid, @levl, 1)";
CreateUser.Parameters.AddWithValue("@unam", UName);
CreateUser.Parameters.AddWithValue("@pass", HashedPass);
CreateUser.Parameters.AddWithValue("@agid", AgentID);
CreateUser.Parameters.AddWithValue("@levl", Level);
_ = await CreateUser.ExecuteNonQueryAsync();
}
}
}, CTS.Token
);
string OutMessage = CreateUser ? "New Agent and respective User Account created" : "New Agent created. User account creation is possible.";
await runner.WriteJsonResponse(StatusCodes.Status201Created, OutMessage, CreateUser ? new SafeUser(UName, AgentID, Level, true) : NewAgent);
}
});
})
.Map("/chagent", agent =>
{
agent.Run(async runner =>
{
if (!await runner.RequestValidated(0, "POST", true)) return;
if (await runner.TryGetBodyJsonAsync(["agentid", "updates"], CTS.Token) is Dictionary<string, JsonElement> InElement)
{
if (InElement["updates"].ValueKind != JsonValueKind.Object) return;
string AgentID = InElement["agentid"].GetString() ?? string.Empty;
JsonElement UpdateFields = InElement["updates"];
using SqlDataReader Updated = await RunReaderAsync(CS, "", Comm =>
{
StringBuilder CommandBuilder = new();
CommandBuilder.Append("UPDATE agents SET");
foreach (JsonProperty Prop in UpdateFields.EnumerateObject())
{
Comm.Parameters.AddWithValue($"@p{Prop.Name}", Prop.Value.ValueKind == JsonValueKind.String ? Prop.Value.GetString() == "DBNull" ? DBNull.Value : Prop.Value.GetString() : Prop.Value.GetInt16());
CommandBuilder.Append($" [{Prop.Name}] = @p{Prop.Name},");
}
Comm.Parameters.AddWithValue("@pagentid", AgentID);
CommandBuilder.Remove(CommandBuilder.Length - 1, 1);
CommandBuilder.Append(" OUTPUT INSERTED.* WHERE agentid = @pagentid");
Comm.CommandText = CommandBuilder.ToString();
}, CTS.Token);
Agent UpAgent = (await Updated.ToListAsync<Agent>(a => new
(
AgentID,
(string)a["name"],
(string)a["jabatan"],
(short)a["deplid"],
(string)a["skangkat"],
DateOnly.FromDateTime((DateTime)a["tmt"]),
a["skperubahan"] == DBNull.Value ? null : (string)a["skperubahan"],
a["tgperubahan"] == DBNull.Value ? null : DateOnly.FromDateTime((DateTime)a["tgperubahan"]),
a["vision"] == DBNull.Value ? null : (string)a["vision"],
a["mission"] == DBNull.Value ? null : (string)a["mission"],
a["photourl"] == DBNull.Value ? null : (string)a["photourl"]
), CTS.Token))[0];
await runner.WriteJsonResponse(StatusCodes.Status202Accepted, "Data updated.", UpAgent);
}
});
})
//=========ACTIVITIES=============
;
}
}