From 3c00b10a1126238ec7b357d3047fbd774f80db57 Mon Sep 17 00:00:00 2001 From: Derek Holloway Date: Tue, 5 Aug 2025 22:10:33 -0700 Subject: [PATCH 1/4] Update todo --- ToDo.yaml | 1 + 1 file changed, 1 insertion(+) diff --git a/ToDo.yaml b/ToDo.yaml index 75ac676..011281a 100755 --- a/ToDo.yaml +++ b/ToDo.yaml @@ -19,6 +19,7 @@ Server: CompanyEmailVerify: Need to update notification email + Create page to notify cx that their work email has been verified Client: jobs/editor: From c2886a1baf9baf462110ab30e8fde77ace6199b1 Mon Sep 17 00:00:00 2001 From: Derek Holloway Date: Thu, 7 Aug 2025 17:10:54 -0700 Subject: [PATCH 2/4] Add fields to Employee SQL --- database/mistox.sql | 2 ++ src/Client/src/app/models/Company.ts | 6 ------ src/Client/src/app/models/Employee.ts | 9 +++++++++ src/Server/Entities/Company.cs | 8 -------- src/Server/Entities/Employee.cs | 9 +++++++++ src/Server/Entities/JobListing.cs | 2 -- src/Server/Entities/Resume.cs | 2 -- .../Services/DatabaseService/Employee.cs | 18 ++++++++++++++++-- 8 files changed, 36 insertions(+), 20 deletions(-) create mode 100644 src/Client/src/app/models/Employee.ts create mode 100644 src/Server/Entities/Employee.cs diff --git a/database/mistox.sql b/database/mistox.sql index bcf7be0..dee3b06 100755 --- a/database/mistox.sql +++ b/database/mistox.sql @@ -146,6 +146,8 @@ CREATE TABLE IF NOT EXISTS `Company` ( CREATE TABLE IF NOT EXISTS `Employee` ( `ID` int NOT NULL AUTO_INCREMENT, `AccountID` int NOT NULL, + `AccountName` varchar(60) NOT NULL, + `AccountEmail` varchar(255) NOT NULL, `CompanyID` int NOT NULL, PRIMARY KEY (`ID`), FOREIGN KEY (`CompanyID`) REFERENCES `Company`(`ID`) ON DELETE CASCADE diff --git a/src/Client/src/app/models/Company.ts b/src/Client/src/app/models/Company.ts index ae79789..a2e4a6a 100644 --- a/src/Client/src/app/models/Company.ts +++ b/src/Client/src/app/models/Company.ts @@ -13,10 +13,4 @@ export class Company { public stateOrRegion: string = ""; public city: string = ""; public description: string = ""; -} - -export class Employee { - public id: number | null = null; - public accountID: number = 0; - public company: Company = new Company; } \ No newline at end of file diff --git a/src/Client/src/app/models/Employee.ts b/src/Client/src/app/models/Employee.ts new file mode 100644 index 0000000..b62a5ff --- /dev/null +++ b/src/Client/src/app/models/Employee.ts @@ -0,0 +1,9 @@ +import { Company } from "./Company"; + +export class Employee { + public id: number | null = null; + public accountID: number = 0; + public accountName: string = ""; + public accountEmail: string = ""; + public company: Company = new Company; +} \ No newline at end of file diff --git a/src/Server/Entities/Company.cs b/src/Server/Entities/Company.cs index f30d2e1..eb942b7 100644 --- a/src/Server/Entities/Company.cs +++ b/src/Server/Entities/Company.cs @@ -1,5 +1,4 @@ namespace BoredCareers.Entities { - public class Company { public int? ID { get; set; } // PK public string Name { get; set; } = ""; @@ -17,11 +16,4 @@ namespace BoredCareers.Entities { public string City { get; set; } = ""; public string Description { get; set; } = ""; } - - public class Employee { - public int? ID { get; set; } // PK - public int AccountID { get; set; } // FK - public Company Company { get; set; } = new Company(); // FK - } - } \ No newline at end of file diff --git a/src/Server/Entities/Employee.cs b/src/Server/Entities/Employee.cs new file mode 100644 index 0000000..3a8c62d --- /dev/null +++ b/src/Server/Entities/Employee.cs @@ -0,0 +1,9 @@ +namespace BoredCareers.Entities { + public class Employee { + public int? ID { get; set; } // PK + public int AccountID { get; set; } + public string AccountName { get; set; } = ""; + public string AccountEmail { get; set; } = ""; + public Company Company { get; set; } = new Company(); // FK + } +} \ No newline at end of file diff --git a/src/Server/Entities/JobListing.cs b/src/Server/Entities/JobListing.cs index 92089e0..f70a734 100644 --- a/src/Server/Entities/JobListing.cs +++ b/src/Server/Entities/JobListing.cs @@ -1,5 +1,4 @@ namespace BoredCareers.Entities { - public class JobListing { public int? ID { get; set; } // PK public int CompanyID { get; set; } // FK @@ -25,5 +24,4 @@ namespace BoredCareers.Entities { public string Name { get; set; } = ""; public string Description { get; set; } = ""; } - } \ No newline at end of file diff --git a/src/Server/Entities/Resume.cs b/src/Server/Entities/Resume.cs index bef81bf..b093c3d 100644 --- a/src/Server/Entities/Resume.cs +++ b/src/Server/Entities/Resume.cs @@ -1,5 +1,4 @@ namespace BoredCareers.Entities { - public class Resume { public int? ID { get; set; } // PK public int AccountID { get; set; } // FK @@ -106,5 +105,4 @@ namespace BoredCareers.Entities { public string URL { get; set; } = ""; public string Description { get; set; } = ""; } - } \ No newline at end of file diff --git a/src/Server/Services/DatabaseService/Employee.cs b/src/Server/Services/DatabaseService/Employee.cs index 8c35c9c..0e96563 100644 --- a/src/Server/Services/DatabaseService/Employee.cs +++ b/src/Server/Services/DatabaseService/Employee.cs @@ -25,6 +25,8 @@ namespace BoredCareers.Services.DatabaseService { while( await reader.ReadAsync() ) { int _id = reader.GetInt32("ID"); int _accountid = reader.GetInt32("AccountID"); + string _accountname = reader.GetString("AccountName"); + string _accountemail = reader.GetString("AccountEmail"); int _companyid = reader.GetInt32("CompanyID"); string _name = reader.GetString("Name"); string _email = reader.GetString("Email"); @@ -42,6 +44,8 @@ namespace BoredCareers.Services.DatabaseService { employee = new Employee() { ID = _id, AccountID = _accountid, + AccountName = _accountname, + AccountEmail = _accountemail, Company = new Company { ID = _companyid, Name = _name, @@ -82,6 +86,8 @@ namespace BoredCareers.Services.DatabaseService { while (await reader.ReadAsync()) { int _id = reader.GetInt32("ID"); int _accountid = reader.GetInt32("AccountID"); + string _accountname = reader.GetString("AccountName"); + string _accountemail = reader.GetString("AccountEmail"); int _companyid = reader.GetInt32("CompanyID"); string _name = reader.GetString("Name"); string _email = reader.GetString("Email"); @@ -99,6 +105,8 @@ namespace BoredCareers.Services.DatabaseService { employees.Add(new Employee() { ID = _id, AccountID = _accountid, + AccountName = _accountname, + AccountEmail = _accountemail, Company = new Company { ID = _companyid, Name = _name, @@ -139,6 +147,8 @@ namespace BoredCareers.Services.DatabaseService { while (await reader.ReadAsync()) { int _id = reader.GetInt32("ID"); int _accountid = reader.GetInt32("AccountID"); + string _accountname = reader.GetString("AccountName"); + string _accountemail = reader.GetString("AccountEmail"); int _companyid = reader.GetInt32("CompanyID"); string _name = reader.GetString("Name"); string _email = reader.GetString("Email"); @@ -156,6 +166,8 @@ namespace BoredCareers.Services.DatabaseService { employees.Add(new Employee() { ID = _id, AccountID = _accountid, + AccountName = _accountname, + AccountEmail = _accountemail, Company = new Company { ID = _companyid, Name = _name, @@ -184,9 +196,9 @@ namespace BoredCareers.Services.DatabaseService { string command = @" INSERT INTO Employee - (ID,AccountID,CompanyID) + (ID,AccountID,AccountName,AccountEmail,CompanyID) VALUES - (@ID,@AccountID,@CompanyID) + (@ID,@AccountID,@AccountName,@AccountEmail,@CompanyID) ON DUPLICATE KEY UPDATE AccountID = @AccountID, CompanyID = @CompanyID; @@ -195,6 +207,8 @@ namespace BoredCareers.Services.DatabaseService { MySqlCommand cmd = new MySqlCommand(command, connection); cmd.Parameters.AddWithValue("@ID", employee.ID); cmd.Parameters.AddWithValue("@AccountID", employee.AccountID); + cmd.Parameters.AddWithValue("@AccountName", employee.AccountName); + cmd.Parameters.AddWithValue("@AccountEmail", employee.AccountEmail); cmd.Parameters.AddWithValue("@CompanyID", employee.Company.ID); await cmd.ExecuteNonQueryAsync(); From 349cada9e6117280325533c86a1f810aa4b473be Mon Sep 17 00:00:00 2001 From: Derek Holloway Date: Thu, 7 Aug 2025 17:21:09 -0700 Subject: [PATCH 3/4] Add employee tracking for company --- .../src/app/pages/main/company/company.component.html | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/Client/src/app/pages/main/company/company.component.html b/src/Client/src/app/pages/main/company/company.component.html index 4ced237..086f32e 100644 --- a/src/Client/src/app/pages/main/company/company.component.html +++ b/src/Client/src/app/pages/main/company/company.component.html @@ -43,7 +43,15 @@

Employees

- + @for (listing of CompEmployees; track listing.id) { +
+
+

{{ listing.accountName }}

+
+ + +
+ }
From 6d81c001df17a17501e10e90d7593494b62dd392 Mon Sep 17 00:00:00 2001 From: Derek Holloway Date: Thu, 7 Aug 2025 17:21:38 -0700 Subject: [PATCH 4/4] Code Cleanup --- .../pages/main/company/company.component.ts | 14 ++++++- .../main/jobs/editor/jobeditor.component.ts | 40 ++++++------------- .../src/app/pages/main/jobs/jobs.component.ts | 11 ----- .../Controllers/AuthenticationController.cs | 2 +- src/Server/Controllers/CompanyController.cs | 8 +++- 5 files changed, 31 insertions(+), 44 deletions(-) diff --git a/src/Client/src/app/pages/main/company/company.component.ts b/src/Client/src/app/pages/main/company/company.component.ts index 015c90d..d2955c9 100644 --- a/src/Client/src/app/pages/main/company/company.component.ts +++ b/src/Client/src/app/pages/main/company/company.component.ts @@ -5,8 +5,9 @@ import { Router, ActivatedRoute, RouterModule } from '@angular/router'; import { Title } from '@angular/platform-browser'; import { CommonModule } from '@angular/common'; import { Authentication } from 'app/services/Authentication'; -import { Company, Employee } from 'app/models/Company'; +import { Company } from 'app/models/Company'; import { JobListing } from 'app/models/JobListing'; +import { Employee } from 'app/models/Employee'; @Component({ selector: 'main-company', @@ -20,6 +21,7 @@ export class CompanyComponent { public Employers: Employee[] = []; public Comp: Company | null = null; + public CompEmployees: Employee[] = []; public Desc: string[] = []; public List: JobListing[] = []; @@ -39,7 +41,6 @@ export class CompanyComponent { this.ErrorMsg = err.error; } }); - }; changeSelectedCompany(companyID: number){ @@ -61,6 +62,15 @@ export class CompanyComponent { this.ErrorMsg = err.error; } }); + + this.http.get("api/employee/" + companyID).subscribe({ + next: data => { + this.CompEmployees = data; + }, + error: err => { + this.ErrorMsg = err.error; + } + }); } RemoveJobListing( JobListingID: number ){ diff --git a/src/Client/src/app/pages/main/jobs/editor/jobeditor.component.ts b/src/Client/src/app/pages/main/jobs/editor/jobeditor.component.ts index b5522dc..6033f17 100644 --- a/src/Client/src/app/pages/main/jobs/editor/jobeditor.component.ts +++ b/src/Client/src/app/pages/main/jobs/editor/jobeditor.component.ts @@ -6,7 +6,6 @@ import { Title } from '@angular/platform-browser'; import { CommonModule } from '@angular/common'; import { JobListing } from 'app/models/JobListing'; import { Authentication } from 'app/services/Authentication'; -import { Company, Employee } from 'app/models/Company'; @Component({ selector: 'main-jobs-editor', @@ -85,35 +84,20 @@ export class JobEditorComponent { this.updateUI(); } - PostNewJob(jobListing: JobListing){ - jobListing.companyID = this.modeID; - this.http.post("api/joblisting", jobListing).subscribe({ - next: data => { - this.router.navigate([""]); - }, - error: err => { - this.ErrorMsg = err.error; - } - }); - } - - PostEditJob(jobListing: JobListing){ - this.http.post("api/joblisting", jobListing).subscribe({ - next: data => { - this.router.navigate([""]); - }, - error: err => { - this.ErrorMsg = err.error; - } - }); - } - - SubmitForm(job: JobListing){ + SubmitForm(jobListing: JobListing){ if (this.mode === "new"){ - this.PostNewJob(job); - }else if (this.mode === "edit"){ - this.PostEditJob(job); + jobListing.companyID = this.modeID; + } else if (this.mode === "edit"){ + jobListing.id = this.modeID; } + this.http.post("api/joblisting", jobListing).subscribe({ + next: data => { + this.router.navigate([""]); + }, + error: err => { + this.ErrorMsg = err.error; + } + }); } } \ No newline at end of file diff --git a/src/Client/src/app/pages/main/jobs/jobs.component.ts b/src/Client/src/app/pages/main/jobs/jobs.component.ts index 6f1d451..ac6d208 100644 --- a/src/Client/src/app/pages/main/jobs/jobs.component.ts +++ b/src/Client/src/app/pages/main/jobs/jobs.component.ts @@ -39,15 +39,4 @@ export class JobsComponent { }; - RemoveJobListing( JobListingID: number ){ - this.http.delete("api/joblisting?JobListingID=" + JobListingID).subscribe({ - next: data => { - window.location.reload(); - }, - error: err => { - this.ErrorMsg = err.error; - } - }); - } - } \ No newline at end of file diff --git a/src/Server/Controllers/AuthenticationController.cs b/src/Server/Controllers/AuthenticationController.cs index 96180d4..7fe6825 100755 --- a/src/Server/Controllers/AuthenticationController.cs +++ b/src/Server/Controllers/AuthenticationController.cs @@ -12,7 +12,7 @@ namespace BoredCareers.Controllers { public AuthenticationController(DatabaseService db) : base(db) { } - [HttpPost("loginState")] + [HttpPost("loginstate")] public ActionResult LoginState() { if (isLoggedIn()) { return Ok(getLoggedInUser()); diff --git a/src/Server/Controllers/CompanyController.cs b/src/Server/Controllers/CompanyController.cs index c37edba..7838f2c 100644 --- a/src/Server/Controllers/CompanyController.cs +++ b/src/Server/Controllers/CompanyController.cs @@ -35,8 +35,12 @@ namespace BoredCareers.Controllers { Company? test = await _databaseService.GetCompany(Convert.ToInt32(company.ID)); if (test == null) { company.ID = await _databaseService.SetCompany(company); + + await _databaseService.SetEmployee(new Employee() { AccountID = getLoggedInUserID(), + AccountName = getLoggedInUser().UserName, + AccountEmail = getLoggedInUser().Email, Company = company }); return Ok(); @@ -66,7 +70,7 @@ namespace BoredCareers.Controllers { } [HttpGet("sendverifyemail")] - public async Task> SendVerify([FromQuery] int CompanyID) { + public async Task SendVerify([FromQuery] int CompanyID) { try { string key = "v" + CompanyID; // Stop from sending multiple emails quickly @@ -99,7 +103,7 @@ namespace BoredCareers.Controllers { } [HttpGet("verifyemail")] - public async Task> VerifyEmail([FromQuery] int CompanyID, [FromQuery] string EmailToken) { + public async Task VerifyEmail([FromQuery] int CompanyID, [FromQuery] string EmailToken) { try { Company? test = await _databaseService.GetCompany(CompanyID); if (test != null) {