From 88847f0ddcecf09bd347d5d5fb06ec7d667695bd Mon Sep 17 00:00:00 2001 From: Derek Holloway Date: Wed, 13 Aug 2025 13:10:40 -0700 Subject: [PATCH] Finalize the DbDriver --- src/Server/Services/DatabaseService/Resume.cs | 48 ++++++-- .../ResumeParts/SetResumeParts.cs | 115 ++++++++---------- 2 files changed, 90 insertions(+), 73 deletions(-) diff --git a/src/Server/Services/DatabaseService/Resume.cs b/src/Server/Services/DatabaseService/Resume.cs index 916704e..3daa744 100644 --- a/src/Server/Services/DatabaseService/Resume.cs +++ b/src/Server/Services/DatabaseService/Resume.cs @@ -119,19 +119,28 @@ namespace BoredCareers.Services.DatabaseService { using (var conn = GetConnection()) { await conn.OpenAsync(); - // Set ResumeID on layer 1 nodes + // Set ResumeID on all nodes int _ResumeID = await SetResume(conn, resume); - if (resume.Millitary != null) { resume.Millitary.ResumeID = _ResumeID; } - foreach (ResumeExperience cur in resume.Experience) { cur.ResumeID = _ResumeID; } + if (resume.Millitary != null) { + resume.Millitary.ResumeID = _ResumeID; + foreach (ResumeMilitaryBullet cur in resume.Millitary.MillitaryBullets) { + cur.ResumeID = _ResumeID; + } + } foreach (ResumeEducation cur in resume.Educations) { cur.ResumeID = _ResumeID; } foreach (ResumeSkill cur in resume.Skills) { cur.ResumeID = _ResumeID; } foreach (ResumeLanguage cur in resume.Languages) { cur.ResumeID = _ResumeID; } foreach (ResumeCertification cur in resume.Certification) { cur.ResumeID = _ResumeID; } foreach (ResumeProject cur in resume.Projects) { cur.ResumeID = _ResumeID; } + foreach (ResumeExperience cur in resume.Experience) { + cur.ResumeID = _ResumeID; + foreach (ResumeExperienceBullet us in cur.ExperienceBullets) { + us.ResumeID = _ResumeID; + } + } + // Async process all non child node SQL sets Task[] tasks = [ - SetResumeExperience(conn, resume.Experience), - SetResumeMilitary(conn, resume.Millitary), SetResumeEducation(conn, resume.Educations), SetResumeSkills(conn, resume.Skills), SetResumeLanguages(conn, resume.Languages), @@ -140,17 +149,32 @@ namespace BoredCareers.Services.DatabaseService { ]; await Task.WhenAll(tasks); - List bullets = new List(); - foreach (ResumeExperience cur in resume.Experience) { - foreach (ResumeExperienceBullet bullet in cur.ExperienceBullets) { - bullets.Add(bullet); + // Setup military task + if (resume.Millitary != null) { + ResumeMilitary militaryTask = await SetResumeMilitary(conn, resume.Millitary); + foreach (ResumeMilitaryBullet cur in resume.Millitary.MillitaryBullets) { + cur.ResumeMilitaryID = Convert.ToInt32(militaryTask.ID); } + await SetResumeMilitaryBullets(conn, resume.Millitary.MillitaryBullets); } - Task ResumeExperienceBulletTask = SetResumeExperienceBullets(ResumeExperienceBulletConnection, bullets.ToArray()); - Task ResumeMilitaryBulletTask = SetResumeMilitaryBullets(ResumeMilitaryBulletConnection, resume.Millitary.MillitaryBullets); + // Setup async process all experience tasks + List> experienceTasks = new List>(); + foreach (ResumeExperience cur in resume.Experience) { + experienceTasks.Add(SetResumeExperience(conn, cur)); + } + await Task.WhenAll(experienceTasks); - return resume; + // Assuming they are returned in the same order they are sent + List experienceBulletTasks = new List(); + for (int i = 0; i < experienceTasks.Count; i++) { + ResumeExperience self = await experienceTasks[i]; + foreach (ResumeExperienceBullet cur in resume.Experience[i].ExperienceBullets) { + cur.ResumeExperienceID = Convert.ToInt32(self.ID); + experienceBulletTasks.Add(SetResumeExperienceBullets(conn, cur)); + } + } + await Task.WhenAll(experienceBulletTasks); } } diff --git a/src/Server/Services/DatabaseService/ResumeParts/SetResumeParts.cs b/src/Server/Services/DatabaseService/ResumeParts/SetResumeParts.cs index ddef872..47054ab 100644 --- a/src/Server/Services/DatabaseService/ResumeParts/SetResumeParts.cs +++ b/src/Server/Services/DatabaseService/ResumeParts/SetResumeParts.cs @@ -49,69 +49,63 @@ namespace BoredCareers.Services.DatabaseService { } } - public async Task SetResumeExperienceBullets(MySqlConnection connection, ResumeExperienceBullet[] bullets) { - foreach (ResumeExperienceBullet cur in bullets) { - string command = @" - INSERT INTO Resume - (ID,ResumeID,ResumeExperienceID,JobFunction) - VALUES - (@ID,@ResumeID,@ResumeExperienceID,@JobFunction) - ON DUPLICATE KEY UPDATE - ResumeID = @ResumeID, - ResumeExperienceID = @ResumeExperienceID, - JobFunction = @JobFunction; - "; + public async Task SetResumeExperienceBullets(MySqlConnection connection, ResumeExperienceBullet bullet) { + string command = @" + INSERT INTO Resume + (ID,ResumeID,ResumeExperienceID,JobFunction) + VALUES + (@ID,@ResumeID,@ResumeExperienceID,@JobFunction) + ON DUPLICATE KEY UPDATE + ResumeID = @ResumeID, + ResumeExperienceID = @ResumeExperienceID, + JobFunction = @JobFunction; + "; - MySqlCommand cmd = new MySqlCommand(command, connection); - cmd.Parameters.AddWithValue("@ID", cur.ID); - cmd.Parameters.AddWithValue("@ResumeID", cur.ResumeID); - cmd.Parameters.AddWithValue("@ResumeExperienceID", cur.ResumeExperienceID); - cmd.Parameters.AddWithValue("@JobFunction", cur.JobFunction); + MySqlCommand cmd = new MySqlCommand(command, connection); + cmd.Parameters.AddWithValue("@ID", bullet.ID); + cmd.Parameters.AddWithValue("@ResumeID", bullet.ResumeID); + cmd.Parameters.AddWithValue("@ResumeExperienceID", bullet.ResumeExperienceID); + cmd.Parameters.AddWithValue("@JobFunction", bullet.JobFunction); - await cmd.ExecuteNonQueryAsync(); - } + await cmd.ExecuteNonQueryAsync(); } - public async Task SetResumeExperience(MySqlConnection connection, ResumeExperience[] experiences) { - foreach (ResumeExperience cur in experiences) { - string command = @" - INSERT INTO Resume - (ID,ResumeID,JobTitle,Company,PostalCode,Country,StateOrRegion,City,DateStarted,StillEmployed,DateEnded) - VALUES - (@ID,@ResumeID,@JobTitle,@Company,@PostalCode,@Country,@StateOrRegion,@City,@DateStarted,@StillEmployed,@DateEnded) - ON DUPLICATE KEY UPDATE - ResumeID = @ResumeID, - JobTitle = @JobTitle, - Company = @Company, - PostalCode = @PostalCode, - Country = @Country, - StateOrRegion = @StateOrRegion, - City = @City, - DateStarted = @DateStarted, - StillEmployed = @StillEmployed, - DateEnded = @DateEnded; + public async Task SetResumeExperience(MySqlConnection connection, ResumeExperience experiences) { + string command = @" + INSERT INTO Resume + (ID,ResumeID,JobTitle,Company,PostalCode,Country,StateOrRegion,City,DateStarted,StillEmployed,DateEnded) + VALUES + (@ID,@ResumeID,@JobTitle,@Company,@PostalCode,@Country,@StateOrRegion,@City,@DateStarted,@StillEmployed,@DateEnded) + ON DUPLICATE KEY UPDATE + ResumeID = @ResumeID, + JobTitle = @JobTitle, + Company = @Company, + PostalCode = @PostalCode, + Country = @Country, + StateOrRegion = @StateOrRegion, + City = @City, + DateStarted = @DateStarted, + StillEmployed = @StillEmployed, + DateEnded = @DateEnded; - SELECT LAST_INSERT_ID(); - "; + SELECT LAST_INSERT_ID(); + "; - MySqlCommand cmd = new MySqlCommand(command, connection); - cmd.Parameters.AddWithValue("@ID", cur.ID); - cmd.Parameters.AddWithValue("@ResumeID", cur.ResumeID); - cmd.Parameters.AddWithValue("@JobTitle", cur.JobTitle); - cmd.Parameters.AddWithValue("@Company", cur.Company); - cmd.Parameters.AddWithValue("@PostalCode", cur.PostalCode); - cmd.Parameters.AddWithValue("@DateStarted", cur.DateStarted.ToUniversalTime()); - cmd.Parameters.AddWithValue("@StillEmployed", cur.StillEmployed); - cmd.Parameters.AddWithValue("@DateEnded", cur.DateEnded.ToUniversalTime()); - object? result = await cmd.ExecuteScalarAsync(); + MySqlCommand cmd = new MySqlCommand(command, connection); + cmd.Parameters.AddWithValue("@ID", experiences.ID); + cmd.Parameters.AddWithValue("@ResumeID", experiences.ResumeID); + cmd.Parameters.AddWithValue("@JobTitle", experiences.JobTitle); + cmd.Parameters.AddWithValue("@Company", experiences.Company); + cmd.Parameters.AddWithValue("@PostalCode", experiences.PostalCode); + cmd.Parameters.AddWithValue("@DateStarted", experiences.DateStarted.ToUniversalTime()); + cmd.Parameters.AddWithValue("@StillEmployed", experiences.StillEmployed); + cmd.Parameters.AddWithValue("@DateEnded", experiences.DateEnded.ToUniversalTime()); + object? result = await cmd.ExecuteScalarAsync(); - if (cur.ID != null && cur.ID != 0) { - return Convert.ToInt32(cur.ID); - } else { - cmd.CommandText = ""; - return Convert.ToInt32(result); - } + if (experiences.ID == null) { + experiences.ID = Convert.ToInt32(result); } + return experiences; } public async Task SetResumeMilitaryBullets(MySqlConnection connection, ResumeMilitaryBullet[] bullets) { @@ -139,7 +133,7 @@ namespace BoredCareers.Services.DatabaseService { } } - public async Task SetResumeMilitary(MySqlConnection connection, ResumeMilitary? military) { + public async Task SetResumeMilitary(MySqlConnection connection, ResumeMilitary? military) { if (military != null) { string command = @" INSERT INTO Resume @@ -167,13 +161,12 @@ namespace BoredCareers.Services.DatabaseService { cmd.Parameters.AddWithValue("@DateEnded", military.DateEnded.ToUniversalTime()); object? result = await cmd.ExecuteScalarAsync(); - if (military.ID != null && military.ID != 0) { - return Convert.ToInt32(military.ID); - } else { - cmd.CommandText = ""; - return Convert.ToInt32(result); + if (military.ID == null) { + military.ID = Convert.ToInt32(result); } + return military; } + return new ResumeMilitary(); } public async Task SetResumeEducation(MySqlConnection connection, ResumeEducation[] educations) {