diff --git a/src/Client/src/app/pages/resumes/resumes.component.html b/src/Client/src/app/pages/resumes/resumes.component.html index 0e9fe97..260a897 100644 --- a/src/Client/src/app/pages/resumes/resumes.component.html +++ b/src/Client/src/app/pages/resumes/resumes.component.html @@ -1,6 +1,8 @@
@for(resume of myResumes; track myResumes.length){ - + @if (resume.id != null){ + + } }
diff --git a/src/Server/Services/DatabaseService/Resume.cs b/src/Server/Services/DatabaseService/Resume.cs index 27e1254..10cee22 100644 --- a/src/Server/Services/DatabaseService/Resume.cs +++ b/src/Server/Services/DatabaseService/Resume.cs @@ -58,41 +58,48 @@ namespace BoredCareers.Services.DatabaseService { return resumes.ToArray(); } - private async Task ExecuteReaderAsync(MySqlConnection conn, string query, int resumeId) { - var cmd = new MySqlCommand(query, conn); - cmd.Parameters.AddWithValue("@ResumeID", resumeId); - return await cmd.ExecuteReaderAsync(); - } - public async Task GetResume(int ResumeID) { using (var conn = GetConnection()) { await conn.OpenAsync(); - Resume? resume = await GetResumeHeader(await ExecuteReaderAsync(conn, "SELECT * FROM Resume WHERE ID = @ResumeID;", ResumeID)); + // Check if resume header exists + Resume? resume = await GetResumeHeader(ResumeID); if (resume == null) { return null; } - Task[] tasks = [ - ExecuteReaderAsync(conn, "SELECT * FROM ResumeExperience WHERE ResumeID = @ResumeID;", ResumeID), - ExecuteReaderAsync(conn, "SELECT * FROM ResumeExperienceBullet WHERE ResumeID = @ResumeID;", ResumeID), - ExecuteReaderAsync(conn, "SELECT * FROM ResumeMilitary WHERE ResumeID = @ResumeID;", ResumeID), - ExecuteReaderAsync(conn, "SELECT * FROM ResumeMilitaryBullet WHERE ResumeID = @ResumeID;", ResumeID), - ExecuteReaderAsync(conn, "SELECT * FROM ResumeEducation WHERE ResumeID = @ResumeID;", ResumeID), - ExecuteReaderAsync(conn, "SELECT * FROM ResumeSkill WHERE ResumeID = @ResumeID;", ResumeID), - ExecuteReaderAsync(conn, "SELECT * FROM ResumeLanguage WHERE ResumeID = @ResumeID;", ResumeID), - ExecuteReaderAsync(conn, "SELECT * FROM ResumeCertification WHERE ResumeID = @ResumeID;", ResumeID), - ExecuteReaderAsync(conn, "SELECT * FROM ResumeProject WHERE ResumeID = @ResumeID;", ResumeID), - ]; - await Task.WhenAll(tasks); + // Create parallel threads + Task experienceTask = GetResumeExperience(ResumeID); + Task experienceBulletsTask = GetResumeExperienceBullets(ResumeID); + Task militaryTask = GetResumeMilitary(ResumeID); + Task militaryBulletsTask = GetResumeMilitaryBullets(ResumeID); + Task educationTask = GetResumeEducation(ResumeID); + Task skillsTask = GetResumeSkills(ResumeID); + Task languagesTask = GetResumeLanguages(ResumeID); + Task certificationTask = GetResumeCertification(ResumeID); + Task projectsTask = GetResumeProjects(ResumeID); - ResumeExperience[] experience = await GetResumeExperience(await tasks[0]); - ResumeExperienceBullet[] bullets = await GetResumeExperienceBullets(await tasks[1]); - ResumeMilitary? military = await GetResumeMilitary(await tasks[2]); - ResumeMilitaryBullet[] militaryBullets = await GetResumeMilitaryBullets(await tasks[3]); - ResumeEducation[] education = await GetResumeEducation(await tasks[4]); - ResumeSkill[] skills = await GetResumeSkills(await tasks[5]); - ResumeLanguage[] languages = await GetResumeLanguages(await tasks[6]); - ResumeCertification[] certs = await GetResumeCertification(await tasks[7]); - ResumeProject[] projects = await GetResumeProjects(await tasks[8]); + // Run all in parallel + await Task.WhenAll( + experienceTask, + experienceBulletsTask, + militaryTask, + militaryBulletsTask, + educationTask, + skillsTask, + languagesTask, + certificationTask, + projectsTask + ); + + // Get results from parallel processes + ResumeExperience[] experience = await experienceTask; + ResumeExperienceBullet[] bullets = await experienceBulletsTask; + ResumeMilitary? military = await militaryTask; + ResumeMilitaryBullet[] militaryBullets = await militaryBulletsTask; + ResumeEducation[] education = await educationTask; + ResumeSkill[] skills = await skillsTask; + ResumeLanguage[] languages = await languagesTask; + ResumeCertification[] certs = await certificationTask; + ResumeProject[] projects = await projectsTask; Dictionary groupedExperienceBullets = bullets.GroupBy(b => Convert.ToInt32(b.ResumeExperienceID)).ToDictionary(g => g.Key, g => g.ToArray()); foreach (var exp in experience) { diff --git a/src/Server/Services/DatabaseService/ResumeParts/GetResumeParts.cs b/src/Server/Services/DatabaseService/ResumeParts/GetResumeParts.cs index b0f4409..a4c9d7a 100644 --- a/src/Server/Services/DatabaseService/ResumeParts/GetResumeParts.cs +++ b/src/Server/Services/DatabaseService/ResumeParts/GetResumeParts.cs @@ -1,246 +1,310 @@ using BoredCareers.Entities; +using MySql.Data.MySqlClient; using System.Data; using System.Data.Common; namespace BoredCareers.Services.DatabaseService { public partial class DatabaseService { - public async Task GetResumeHeader(DbDataReader reader) { - while (await reader.ReadAsync()) { - if (reader == null) { break; } - int _id = reader.GetInt32("ID"); - int _accountid = reader.GetInt32("AccountID"); - string _title = reader.GetString("Title"); - string _name = reader.GetString("Name"); - string _field = reader.GetString("Field"); - string _email = reader.GetString("Email"); - string _phonenumber = reader.GetString("PhoneNumber"); - string _postalcode = reader.GetString("PostalCode"); - string _country = reader.GetString("Country"); - string _state = reader.GetString("StateOrRegion"); - string _city = reader.GetString("City"); - bool _isactive = reader.GetBoolean("IsActive"); - return new Resume() { - ID = _id, - AccountID = _accountid, - Title = _title, - Name = _name, - Field = _field, - Email = _email, - PhoneNumber = _phonenumber, - PostalCode = _postalcode, - Country = _country, - StateOrRegion = _state, - City = _city, - IsActive = _isactive - }; + string GetString(DbDataReader reader, string name) { + return reader.IsDBNull(reader.GetOrdinal(name)) ? "" : reader.GetString(name); + } + + public async Task GetResumeHeader(int ResumeID) { + using (MySqlConnection connection = GetConnection()) { + await connection.OpenAsync(); + MySqlCommand cmd = new MySqlCommand("SELECT * FROM Resume WHERE ID = @ID;", connection); + cmd.Parameters.AddWithValue("@ID", ResumeID); + using (DbDataReader reader = await cmd.ExecuteReaderAsync()) { + while (await reader.ReadAsync()) { + int _id = reader.GetInt32("ID"); + int _accountid = reader.GetInt32("AccountID"); + string _title = GetString(reader, "Title"); + string _name = GetString(reader, "Name"); + string _field = GetString(reader, "Field"); + string _email = GetString(reader, "Email"); + string _phonenumber = GetString(reader, "PhoneNumber"); + string _postalcode = GetString(reader, "PostalCode"); + string _country = GetString(reader, "Country"); + string _state = GetString(reader, "StateOrRegion"); + string _city = GetString(reader, "City"); + bool _isactive = reader.GetBoolean("IsActive"); + return new Resume() { + ID = _id, + AccountID = _accountid, + Title = _title, + Name = _name, + Field = _field, + Email = _email, + PhoneNumber = _phonenumber, + PostalCode = _postalcode, + Country = _country, + StateOrRegion = _state, + City = _city, + IsActive = _isactive + }; + } + } } return null; } - public async Task GetResumeExperienceBullets(DbDataReader reader) { - List experienceBullets = new List(); - while (await reader.ReadAsync()) { - if (reader == null) { break; } - int _id = reader.GetInt32("ID"); - int _resumeid = reader.GetInt32("ResumeID"); - int _experienceid = reader.GetInt32("ResumeExperienceID"); - string _jobfunction = reader.GetString("JobFunction"); - experienceBullets.Add(new ResumeExperienceBullet() { - ID = _id, - ResumeID = _resumeid, - ResumeExperienceID = _experienceid, - JobFunction = _jobfunction - }); - } - return experienceBullets.ToArray(); - } - - public async Task GetResumeExperience(DbDataReader reader) { + public async Task GetResumeExperience(int resumeId) { List experience = new List(); - while (await reader.ReadAsync()) { - if (reader == null) { break; } - int _id = reader.GetInt32("ID"); - int _resumeid = reader.GetInt32("ResumeID"); - string _jobtitle = reader.GetString("JobTitle"); - string _company = reader.GetString("Company"); - string _postalcode = reader.GetString("PostalCode"); - string _country = reader.GetString("Country"); - string _state = reader.GetString("StateOrRegion"); - string _city = reader.GetString("City"); - DateTime _datestarted = reader.GetDateTime("DateStarted"); - bool _stillempoyed = reader.GetBoolean("StillEmployed"); - DateTime _dateended = reader.GetDateTime("DateEnded"); - experience.Add(new ResumeExperience() { - ID = _id, - ResumeID = _resumeid, - JobTitle = _jobtitle, - Company = _company, - PostalCode = _postalcode, - Country = _country, - StateOrRegion = _state, - City = _city, - DateStarted = _datestarted, - StillEmployed = _stillempoyed, - DateEnded = _dateended, - }); + using (var conn = GetConnection()) { + await conn.OpenAsync(); + var cmd = new MySqlCommand("SELECT * FROM ResumeExperience WHERE ResumeID = @ResumeID;", conn); + cmd.Parameters.AddWithValue("@ResumeID", resumeId); + using (DbDataReader reader = await cmd.ExecuteReaderAsync()) { + while (await reader.ReadAsync()) { + int _id = reader.GetInt32("ID"); + int _resumeid = reader.GetInt32("ResumeID"); + string _jobtitle = GetString(reader, "JobTitle"); + string _company = GetString(reader, "Company"); + string _postalcode = GetString(reader, "PostalCode"); + string _country = GetString(reader, "Country"); + string _state = GetString(reader, "StateOrRegion"); + string _city = GetString(reader, "City"); + DateTime _datestarted = reader.GetDateTime("DateStarted"); + bool _stillempoyed = reader.GetBoolean("StillEmployed"); + DateTime _dateended = reader.GetDateTime("DateEnded"); + experience.Add(new ResumeExperience() { + ID = _id, + ResumeID = _resumeid, + JobTitle = _jobtitle, + Company = _company, + PostalCode = _postalcode, + Country = _country, + StateOrRegion = _state, + City = _city, + DateStarted = _datestarted, + StillEmployed = _stillempoyed, + DateEnded = _dateended, + }); + } + } } return experience.ToArray(); } - public async Task GetResumeMilitaryBullets(DbDataReader reader) { + public async Task GetResumeExperienceBullets(int resumeId) { + List experienceBullets = new List(); + using (var conn = GetConnection()) { + await conn.OpenAsync(); + var cmd = new MySqlCommand("SELECT * FROM ResumeExperienceBullet WHERE ResumeID = @ResumeID;", conn); + cmd.Parameters.AddWithValue("@ResumeID", resumeId); + using (DbDataReader reader = await cmd.ExecuteReaderAsync()) { + while (await reader.ReadAsync()) { + int _id = reader.GetInt32("ID"); + int _resumeid = reader.GetInt32("ResumeID"); + int _experienceid = reader.GetInt32("ResumeExperienceID"); + string _jobfunction = GetString(reader, "JobFunction"); + experienceBullets.Add(new ResumeExperienceBullet() { + ID = _id, + ResumeID = _resumeid, + ResumeExperienceID = _experienceid, + JobFunction = _jobfunction + }); + } + } + } + return experienceBullets.ToArray(); + } + + public async Task GetResumeMilitaryBullets(int resumeId) { List militaryBullets = new List(); - while (await reader.ReadAsync()) { - if (reader == null) { break; } - int _id = reader.GetInt32("ID"); - int _resumeid = reader.GetInt32("ResumeID"); - int _experienceid = reader.GetInt32("ResumeMilitaryID"); - string _achievement = reader.GetString("Achievement"); - string _description = reader.GetString("Description"); - militaryBullets.Add(new ResumeMilitaryBullet() { - ID = _id, - ResumeID = _resumeid, - ResumeMilitaryID = _experienceid, - Achievement = _achievement, - Description = _description - }); + using (var conn = GetConnection()) { + await conn.OpenAsync(); + var cmd = new MySqlCommand("SELECT * FROM ResumeMilitaryBullet WHERE ResumeID = @ResumeID;", conn); + cmd.Parameters.AddWithValue("@ResumeID", resumeId); + using (DbDataReader reader = await cmd.ExecuteReaderAsync()) { + while (await reader.ReadAsync()) { + int _id = reader.GetInt32("ID"); + int _resumeid = reader.GetInt32("ResumeID"); + int _experienceid = reader.GetInt32("ResumeMilitaryID"); + string _achievement = GetString(reader, "Achievement"); + string _description = GetString(reader, "Description"); + militaryBullets.Add(new ResumeMilitaryBullet() { + ID = _id, + ResumeID = _resumeid, + ResumeMilitaryID = _experienceid, + Achievement = _achievement, + Description = _description + }); + } + } } return militaryBullets.ToArray(); } - public async Task GetResumeMilitary(DbDataReader reader) { + public async Task GetResumeMilitary(int resumeId) { ResumeMilitary? military = null; - while (await reader.ReadAsync()) { - if (reader == null) { break; } - int _id = reader.GetInt32("ID"); - int _resumeid = reader.GetInt32("ResumeID"); - string _country = reader.GetString("Country"); - string _rank = reader.GetString("Rank"); - DateTime _datestarted = reader.GetDateTime("DateStarted"); - bool _stillServing = reader.GetBoolean("StillServing"); - DateTime _dateended = reader.GetDateTime("DateEnded"); - military = new ResumeMilitary() { - ID = _id, - ResumeID = _resumeid, - Country = _country, - Rank = _rank, - DateStarted = _datestarted, - StillServing = _stillServing, - DateEnded = _dateended, - }; + using (var conn = GetConnection()) { + await conn.OpenAsync(); + var cmd = new MySqlCommand("SELECT * FROM ResumeMilitary WHERE ResumeID = @ResumeID;", conn); + cmd.Parameters.AddWithValue("@ResumeID", resumeId); + using (DbDataReader reader = await cmd.ExecuteReaderAsync()) { + while (await reader.ReadAsync()) { + int _id = reader.GetInt32("ID"); + int _resumeid = reader.GetInt32("ResumeID"); + string _country = GetString(reader, "Country"); + string _rank = GetString(reader, "Rank"); + DateTime _datestarted = reader.GetDateTime("DateStarted"); + bool _stillServing = reader.GetBoolean("StillServing"); + DateTime _dateended = reader.GetDateTime("DateEnded"); + military = new ResumeMilitary() { + ID = _id, + ResumeID = _resumeid, + Country = _country, + Rank = _rank, + DateStarted = _datestarted, + StillServing = _stillServing, + DateEnded = _dateended, + }; + } + } } return military; } - public async Task GetResumeEducation(DbDataReader reader) { + public async Task GetResumeEducation(int resumeId) { List? education = new List(); - while (await reader.ReadAsync()) { - if (reader == null) { break; } - int _id = reader.GetInt32("ID"); - int _resumeid = reader.GetInt32("ResumeID"); - string _degreetype = reader.GetString("DegreeType"); - string _degreefield = reader.GetString("DegreeField"); - string _school = reader.GetString("School"); - string _postalcode = reader.GetString("PostalCode"); - string _country = reader.GetString("Country"); - string _state = reader.GetString("StateOrRegion"); - string _city = reader.GetString("City"); - DateTime _datestarted = reader.GetDateTime("DateStarted"); - bool _stillstudying = reader.GetBoolean("StillStudying"); - DateTime _dateended = reader.GetDateTime("DateEnded"); - education.Add(new ResumeEducation { - ID = _id, - ResumeID = _resumeid, - DegreeType = _degreetype, - DegreeField = _degreefield, - School = _school, - PostalCode = _postalcode, - Country = _country, - StateOrRegion = _state, - City = _city, - DateStarted = _datestarted, - StillStudying = _stillstudying, - DateEnded = _dateended - }); + using (var conn = GetConnection()) { + await conn.OpenAsync(); + var cmd = new MySqlCommand("SELECT * FROM ResumeEducation WHERE ResumeID = @ResumeID;", conn); + cmd.Parameters.AddWithValue("@ResumeID", resumeId); + using (DbDataReader reader = await cmd.ExecuteReaderAsync()) { + while (await reader.ReadAsync()) { + int _id = reader.GetInt32("ID"); + int _resumeid = reader.GetInt32("ResumeID"); + string _degreetype = GetString(reader, "DegreeType"); + string _degreefield = GetString(reader, "DegreeField"); + string _school = GetString(reader, "School"); + string _postalcode = GetString(reader, "PostalCode"); + string _country = GetString(reader, "Country"); + string _state = GetString(reader, "StateOrRegion"); + string _city = GetString(reader, "City"); + DateTime _datestarted = reader.GetDateTime("DateStarted"); + bool _stillstudying = reader.GetBoolean("StillStudying"); + DateTime _dateended = reader.GetDateTime("DateEnded"); + education.Add(new ResumeEducation { + ID = _id, + ResumeID = _resumeid, + DegreeType = _degreetype, + DegreeField = _degreefield, + School = _school, + PostalCode = _postalcode, + Country = _country, + StateOrRegion = _state, + City = _city, + DateStarted = _datestarted, + StillStudying = _stillstudying, + DateEnded = _dateended + }); + } + } } return education.ToArray(); } - public async Task GetResumeSkills(DbDataReader reader) { + public async Task GetResumeSkills(int resumeId) { List skills = new List(); - while (await reader.ReadAsync()) { - if (reader == null) { break; } - int _id = reader.GetInt32("ID"); - int _resumeid = reader.GetInt32("ResumeID"); - string _name = reader.GetString("Name"); - string _description = reader.GetString("Description"); - skills.Add( new ResumeSkill { - ID = _id, - ResumeID = _resumeid, - Name = _name, - Description = _description - } ); + using (var conn = GetConnection()) { + await conn.OpenAsync(); + var cmd = new MySqlCommand("SELECT * FROM ResumeSkill WHERE ResumeID = @ResumeID;", conn); + cmd.Parameters.AddWithValue("@ResumeID", resumeId); + using (DbDataReader reader = await cmd.ExecuteReaderAsync()) { + while (await reader.ReadAsync()) { + int _id = reader.GetInt32("ID"); + int _resumeid = reader.GetInt32("ResumeID"); + string _name = GetString(reader, "Name"); + string _description = GetString(reader, "Description"); + skills.Add(new ResumeSkill { + ID = _id, + ResumeID = _resumeid, + Name = _name, + Description = _description + }); + } + } } return skills.ToArray(); } - public async Task GetResumeLanguages(DbDataReader reader) { + public async Task GetResumeLanguages(int resumeId) { List? languages = new List(); - while (await reader.ReadAsync()) { - if (reader == null) { break; } - int _id = reader.GetInt32("ID"); - int _resumeid = reader.GetInt32("ResumeID"); - string _language = reader.GetString("Language"); - string _proficiency = reader.GetString("Proficiency"); - languages.Add( new ResumeLanguage { - ID = _id, - ResumeID = _resumeid, - Language = _language, - Proficiency = _proficiency - } ); + using (var conn = GetConnection()) { + await conn.OpenAsync(); + var cmd = new MySqlCommand("SELECT * FROM ResumeLanguage WHERE ResumeID = @ResumeID;", conn); + cmd.Parameters.AddWithValue("@ResumeID", resumeId); + using (DbDataReader reader = await cmd.ExecuteReaderAsync()) { + while (await reader.ReadAsync()) { + int _id = reader.GetInt32("ID"); + int _resumeid = reader.GetInt32("ResumeID"); + string _language = GetString(reader, "Language"); + string _proficiency = GetString(reader, "Proficiency"); + languages.Add(new ResumeLanguage { + ID = _id, + ResumeID = _resumeid, + Language = _language, + Proficiency = _proficiency + }); + } + } } return languages.ToArray(); } - public async Task GetResumeCertification(DbDataReader reader) { + public async Task GetResumeCertification(int resumeId) { List certs = new List(); - while (await reader.ReadAsync()) { - if (reader == null) { break; } - int _id = reader.GetInt32("ID"); - int _resumeid = reader.GetInt32("ResumeID"); - string _name = reader.GetString("Name"); - string _url = reader.GetString("VerificationURL"); - string _description = reader.GetString("Description"); - certs.Add( new ResumeCertification { - ID = _id, - ResumeID = _resumeid, - Name = _name, - VerificationURL = _url, - Description = _description - } ); + using (var conn = GetConnection()) { + await conn.OpenAsync(); + var cmd = new MySqlCommand("SELECT * FROM ResumeCertification WHERE ResumeID = @ResumeID;", conn); + cmd.Parameters.AddWithValue("@ResumeID", resumeId); + using (DbDataReader reader = await cmd.ExecuteReaderAsync()) { + while (await reader.ReadAsync()) { + int _id = reader.GetInt32("ID"); + int _resumeid = reader.GetInt32("ResumeID"); + string _name = GetString(reader, "Name"); + string _url = GetString(reader, "VerificationURL"); + string _description = GetString(reader, "Description"); + certs.Add(new ResumeCertification { + ID = _id, + ResumeID = _resumeid, + Name = _name, + VerificationURL = _url, + Description = _description + }); + } + } } return certs.ToArray(); } - public async Task GetResumeProjects(DbDataReader reader) { + public async Task GetResumeProjects(int resumeId) { List? projects = new List(); - while (await reader.ReadAsync()) { - if (reader == null) { break; } - int _id = reader.GetInt32("ID"); - int _resumeid = reader.GetInt32("ResumeID"); - string _name = reader.GetString("Name"); - string _url = reader.GetString("URL"); - string _description = reader.GetString("Description"); - projects.Add( new ResumeProject { - ID = _id, - ResumeID = _resumeid, - Name = _name, - URL = _url, - Description = _description - } ); + using (var conn = GetConnection()) { + await conn.OpenAsync(); + var cmd = new MySqlCommand("SELECT * FROM ResumeProject WHERE ResumeID = @ResumeID;", conn); + cmd.Parameters.AddWithValue("@ResumeID", resumeId); + using (DbDataReader reader = await cmd.ExecuteReaderAsync()) { + while (await reader.ReadAsync()) { + int _id = reader.GetInt32("ID"); + int _resumeid = reader.GetInt32("ResumeID"); + string _name = GetString(reader, "Name"); + string _url = GetString(reader, "URL"); + string _description = GetString(reader, "Description"); + projects.Add(new ResumeProject { + ID = _id, + ResumeID = _resumeid, + Name = _name, + URL = _url, + Description = _description + }); + } + } } return projects.ToArray(); } - } }