Merge pull request 'api-server-setup' (#1) from api-server-setup into main
Docker Build and Release Upload / build (push) Successful in 1m15s

Reviewed-on: #1
This commit was merged in pull request #1.
This commit is contained in:
2025-07-16 04:17:24 +00:00
24 changed files with 1474 additions and 461 deletions
-53
View File
@@ -1,53 +0,0 @@
Server:
AccountInventory.cs
SetInventory isnt fully implimented
ProjectMistData.cs
Data inside the sql doesnt match what is inside the database
Emails:
Dont follow theme of website
Admin Functions:
Dont inforce Admin on the API side
Authentication ProductController
When the create account is called. right after the getaccount is called.
Have all New for database return the object they create
Update API
Split apart the different routes and Functions
No more new / update -> only get / set
Make all apis return statuscodes
make all input types form's
make all getLoggedInUsers() -> make sure that i cant just call getLoggedInUserID
Need to timeout email reset tokens
Client:
Program
Probably need to turn on cors at some point
Account
Need to add in settings / data pages
After a new account is created notify a user that they need to verify their email before logging in
ProductController
Need to figure out new way to download purchased items as there is currently no way
Store
Edit product needs created
Need to add cart back
Need to add in payment page
Need to add in payment success/failed
Need to add in Receipt page
TopBar
No way to minimize the UI topbar on mobile
Not themed on mobile
API
Some of the API's Changed. Need to go back and update the client API calls
database
Need to create all the forign key policies
Executable
+11
View File
@@ -0,0 +1,11 @@
Server:
Emails:
Dont follow theme of website
Need to timeout email reset tokens:
Client:
database:
Add Applied Jobs Table
+27 -12
View File
@@ -15,7 +15,6 @@ CREATE TABLE IF NOT EXISTS `Account` (
`Role` varchar(45) DEFAULT NULL,
`EmailToken` varchar(45) DEFAULT NULL,
`DataServer` varchar(200) DEFAULT NULL,
`ServerRegion` varchar(10) DEFAULT NULL,
UNIQUE(`Email`),
UNIQUE(`UserName`),
PRIMARY KEY (`ID`)
@@ -57,13 +56,15 @@ CREATE TABLE IF NOT EXISTS `Resume` (
CREATE TABLE IF NOT EXISTS `ResumeExperienceBullet` (
`ID` int NOT NULL AUTO_INCREMENT,
`ResumeID` int NOT NULL,
`ResumeExperienceID` int NOT NULL,
`JobFunction` text NOT NULL,
PRIMARY KEY (`ID`),
FOREIGN KEY (`ResumeID`) REFERENCES `Resume`(`ID`) ON DELETE CASCADE,
FOREIGN KEY (`ResumeExperienceID`) REFERENCES `ResumeExperience`(`ID`) ON DELETE CASCADE
) AUTO_INCREMENT=1;
CREATE TABLE IF NOT EXISTS `ResumeMillitary` (
CREATE TABLE IF NOT EXISTS `ResumeMilitary` (
`ID` int NOT NULL AUTO_INCREMENT,
`ResumeID` int NOT NULL,
`Country` char(2) NOT NULL,
@@ -75,13 +76,15 @@ CREATE TABLE IF NOT EXISTS `Resume` (
FOREIGN KEY (`ResumeID`) REFERENCES `Resume`(`ID`) ON DELETE CASCADE
) AUTO_INCREMENT=1;
CREATE TABLE IF NOT EXISTS `ResumeMillitaryBullet` (
CREATE TABLE IF NOT EXISTS `ResumeMilitaryBullet` (
`ID` int NOT NULL AUTO_INCREMENT,
`ResumeMillitaryID` int NOT NULL,
`Achevement` varchar(100) NOT NULL,
`ResumeID` int NOT NULL,
`ResumeMilitaryID` int NOT NULL,
`Achievement` varchar(100) NOT NULL,
`Description` text DEFAULT NULL,
PRIMARY KEY (`ID`),
FOREIGN KEY (`ResumeMillitaryID`) REFERENCES `ResumeMillitary`(`ID`) ON DELETE CASCADE
FOREIGN KEY (`ResumeID`) REFERENCES `Resume`(`ID`) ON DELETE CASCADE,
FOREIGN KEY (`ResumeMilitaryID`) REFERENCES `ResumeMilitary`(`ID`) ON DELETE CASCADE
) AUTO_INCREMENT=1;
CREATE TABLE IF NOT EXISTS `ResumeEducation` (
@@ -146,17 +149,26 @@ CREATE TABLE IF NOT EXISTS `Company` (
`Name` varchar(100) DEFAULT NULL,
`Email` varchar(255) DEFAULT NULL,
`EmailVerified` boolean DEFAULT 0,
`WebsiteURL` VARCHAR(255) DEFAULT NULL,
`LogoURL` VARCHAR(2048) DEFAULT NULL,
`Phone` VARCHAR(20) DEFAULT NULL,
`WebsiteURL` varchar(255) DEFAULT NULL,
`LogoURL` varchar(2048) DEFAULT NULL,
`Phone` varchar(20) DEFAULT NULL,
`PostalCode` varchar(20) NOT NULL,
`Country` CHAR(2) NOT NULL,
`Country` char(2) NOT NULL,
`StateOrRegion` varchar(100) NOT NULL,
`City` VARCHAR(100),
`Description` TEXT,
`City` varchar(100),
`Description` text,
PRIMARY KEY (`ID`)
) AUTO_INCREMENT=1;
CREATE TABLE IF NOT EXISTS `Employee` (
`ID` int NOT NULL AUTO_INCREMENT,
`AccountID` int NOT NULL,
`CompanyID` int NOT NULL,
PRIMARY KEY (`ID`),
FOREIGN KEY (`AccountID`) REFERENCES `Account`(`ID`) ON DELETE CASCADE,
FOREIGN KEY (`CompanyID`) REFERENCES `Company`(`ID`) ON DELETE CASCADE
) AUTO_INCREMENT=1;
CREATE TABLE IF NOT EXISTS `JobListing` (
`ID` int NOT NULL AUTO_INCREMENT,
`CompanyID` int NOT NULL,
@@ -170,6 +182,9 @@ CREATE TABLE IF NOT EXISTS `JobListing` (
`JobType` varchar(20) NOT NULL,
`Remote` boolean DEFAULT 0,
`Description` text NOT NULL,
`CreatedTime` datetime Default NULL,
`ModifiedTime` datetime DEFAULT NULL,
`IsDeleted` boolean Default 0,
PRIMARY KEY (`ID`),
FOREIGN KEY (`CompanyID`) REFERENCES `Company`(`ID`) ON DELETE CASCADE
) AUTO_INCREMENT=1;
@@ -5,10 +5,12 @@ using System.Security.Claims;
using BoredCareers.Services;
using BoredCareers.Services.DatabaseService;
using BoredCareers.Entities;
using Microsoft.AspNetCore.Http.HttpResults;
using System.Web.Http;
namespace BoredCareers.Controllers {
[ApiController]
[Route("api/account/[controller]")]
[Route("api/account/")]
public class AuthenticationController : MistoxControllerBase {
EmailService _emailContext;
@@ -26,7 +28,7 @@ namespace BoredCareers.Controllers {
if (test.EmailVerified == true) {
if (test.FailedPasswordLock) {
if (test.CurrentPasswordAttempts >= test.PasswordAttempts) {
return new Account() { Error = "Too many failed password attempts. Please reset your password" };
return NotFound("Too many failed password attempts. Please reset your password");
}
}
if (BCrypt.Net.BCrypt.Verify(PasswordHash, test.PasswordHash)) {
@@ -34,7 +36,8 @@ namespace BoredCareers.Controllers {
await _databaseService.SetAccount(test);
List<Claim> claims = new List<Claim>() {
new Claim("ID", test.ID.ToString())
new Claim("ID", test.ID.ToString()),
new Claim(ClaimTypes.NameIdentifier, test.ID.ToString())
};
await HttpContext.SignInAsync(
@@ -46,21 +49,20 @@ namespace BoredCareers.Controllers {
}
);
return test;
}
else {
} else {
test.CurrentPasswordAttempts += 1;
await _databaseService.SetAccount(test);
return new Account() { Error = "Wrong password" };
return Ok(new Account() { ID = -1, UserName = "Wrong Password" });
}
}
else {
} else {
await SendVerify(test.UserName);
return new Account() { Error = "A new verify email has been sent. \n Note only 1 email send every 5 mintes" };
return NotFound("A new verify email has been sent. \n Note only 1 email send every 5 mintes");
}
}
return new Account() { Error = "User doesn't exist" };
return NotFound("Account Not Found");
} catch (Exception ex) {
return new Account() { Error = ex.Message };
Console.WriteLine("Login Error: " + ex.Message);
return NotFound();
}
}
@@ -70,37 +72,35 @@ namespace BoredCareers.Controllers {
try {
if (await _databaseService.GetAccount(UserName.ToLower()) == null) {
if (await _databaseService.GetAccount(Email.ToLower()) == null) {
Account? created = new Account() {
Account created = new Account() {
UserName = UserName.ToLower(),
Email = Email.ToLower(),
EmailVerified = false,
PasswordHash = BCrypt.Net.BCrypt.HashPassword(PasswordHash),
};
await _databaseService.SetAccount(created);
created = await _databaseService.GetAccount(Email.ToLower());
if (created != null) {
await SendVerify(created.UserName);
return created;
Account? loadedAccount = await _databaseService.GetAccount(Email.ToLower());
if (loadedAccount != null) {
await SendVerify(loadedAccount.UserName);
return Ok(loadedAccount);
}
return new Account() { Error = "Unknown Error" };
return NotFound("Unable to create the account");
} else {
return NotFound("Email is already in use");
}
else {
return new Account() { Error = "Email is already in use" };
}
}
else {
return new Account() { Error = "UserName is taken" };
} else {
return NotFound("UserName is taken");
}
} catch (Exception ex) {
Console.WriteLine("Error: " + ex.Message);
return new Account() { Error = ex.Message };
Console.WriteLine("Register Error: " + ex.Message);
return NotFound();
}
}
[Route("changepassword")]
[HttpPost]
public async Task<ActionResult<bool>> ChangePassword([FromForm] string OldPassword, [FromForm] string NewPassword) {
public async Task<ActionResult> ChangePassword([FromForm] string OldPassword, [FromForm] string NewPassword) {
try {
if (isLoggedIn()) {
Account user = await getLoggedInUser();
@@ -108,12 +108,13 @@ namespace BoredCareers.Controllers {
user.PasswordHash = BCrypt.Net.BCrypt.HashPassword(NewPassword);
user.CurrentPasswordAttempts = 0;
await _databaseService.SetAccount(user);
return true;
return Ok();
}
}
return false;
} catch {
return false;
return NotFound();
} catch (Exception ex) {
Console.WriteLine("ChangePassword Error: " + ex.Message);
return NotFound();
}
}
@@ -126,31 +127,37 @@ namespace BoredCareers.Controllers {
user.FailedPasswordLock = AccountLock;
user.CurrentPasswordAttempts = 0;
await _databaseService.SetAccount(user);
return "Account Lock Status Updated";
return Ok();
}
return "Unknown Error Occurred";
return NotFound();
} catch (Exception ex) {
return ex.Message;
Console.WriteLine("ToggleAccountLock Error: " + ex.Message);
return NotFound();
}
}
[Route("get")]
[HttpPost]
public async Task<ActionResult<Account?>> Get() {
public async Task<ActionResult<Account>> Get() {
try {
if (isLoggedIn()) {
return await getLoggedInUser();
return Ok(await getLoggedInUser());
}
return Ok();
} catch {
return Ok();
return NotFound();
} catch (Exception ex) {
Console.WriteLine("Get Error: " + ex);
return NotFound();
}
}
[Route("logout")]
[HttpPost]
public async Task Logout() {
await HttpContext.SignOutAsync();
public async Task<ActionResult> Logout() {
if (isLoggedIn()) {
await HttpContext.SignOutAsync();
return Ok();
}
return NotFound();
}
[Route("sendverifyemail")]
@@ -266,18 +273,19 @@ namespace BoredCareers.Controllers {
[Route("delete")]
[HttpPost]
public async Task<ActionResult<bool>> delete([FromForm] string Password) {
public async Task<ActionResult> delete([FromForm] string Password) {
try {
if (isLoggedIn()) {
Account user = await getLoggedInUser();
if (BCrypt.Net.BCrypt.Verify(Password, user.PasswordHash)) {
await _databaseService.DeleteAccount(user.ID);
return true;
return Ok();
}
}
return false;
} catch {
return false;
return NotFound();
} catch (Exception ex) {
Console.WriteLine("Delete Error: " + ex.Message);
return NotFound();
}
}
-69
View File
@@ -1,69 +0,0 @@
using Microsoft.AspNetCore.Mvc;
using BoredCareers.Entities;
using BoredCareers.Services.DatabaseService;
namespace BoredCareers.Controllers {
[ApiController]
[Route("api/cart/[controller]")]
public class CartController : MistoxControllerBase {
CartController(DatabaseService db) : base(db) { }
[Route("get")]
[HttpPost]
public async Task<ActionResult<Cart[]>> GetCart() {
try {
if (isLoggedIn()) {
return Ok(await _databaseService.GetCart(getLoggedInUserID()));
}
return StatusCode(500);
} catch {
return StatusCode(500);
}
}
[Route("add")]
[HttpPost]
public async Task<IActionResult> AddCart([FromBody] Cart cart) {
try {
if (isLoggedIn()) {
cart.AccountID = getLoggedInUserID();
await _databaseService.AddToCart(cart);
return Ok();
}
return StatusCode(500);
} catch {
return StatusCode(500);
}
}
[Route("remove")]
[HttpPost]
public async Task<IActionResult> RemoveCart([FromBody] Cart cart) {
try {
if (isLoggedIn()) {
cart.AccountID = getLoggedInUserID();
await _databaseService.RemoveFromCart(cart);
return Ok();
}
return StatusCode(500);
} catch {
return StatusCode(500);
}
}
[Route("clear")]
[HttpPost]
public async Task<IActionResult> ClearCart() {
try {
if (isLoggedIn()) {
await _databaseService.ClearCart(getLoggedInUserID());
return Ok();
}
return StatusCode(500);
} catch {
return StatusCode(500);
}
}
}
}
@@ -0,0 +1,48 @@
using Microsoft.AspNetCore.Mvc;
using BoredCareers.Services.DatabaseService;
using BoredCareers.Entities;
using System.Web.Http;
namespace BoredCareers.Controllers {
[ApiController]
[Route("api/company")]
public class CompanyController : MistoxControllerBase {
public CompanyController(DatabaseService db) : base(db) {}
[HttpGet]
public async Task<IActionResult> GetCompany(int CompanyID) {
if (isLoggedIn()) {
Company? company = await _databaseService.GetCompany(CompanyID);
if (company != null) {
return Ok(company);
}
}
return NotFound();
}
[HttpPost]
public async Task<IActionResult> SetCompany([FromBody] Company company) {
if (isLoggedIn()) {
if (await isLoggedInUserEmployeeOf(company.ID)) {
await _databaseService.SetCompany(company);
return Ok();
}
}
return NotFound();
}
[HttpDelete]
public async Task<IActionResult> DeleteCompany(int CompanyID) {
if (isLoggedIn()) {
if (await isLoggedInUserEmployeeOf(CompanyID)) {
await _databaseService.DeleteCompany(CompanyID);
return Ok();
}
}
return NotFound();
}
}
}
@@ -0,0 +1,53 @@
using Microsoft.AspNetCore.Mvc;
using BoredCareers.Services.DatabaseService;
using BoredCareers.Entities;
using System.Web.Http;
namespace BoredCareers.Controllers {
[ApiController]
[Route("api/joblisting")]
public class JobListingController : MistoxControllerBase {
public JobListingController(DatabaseService db) : base(db) {}
[HttpGet("{JobListingID}")]
public async Task<IActionResult> GetJobListing([FromRoute] int JobListingID) {
var jobListing = await _databaseService.GetJobListing(JobListingID);
if (jobListing != null) {
return Ok(jobListing);
}
return NotFound();
}
[HttpGet]
public async Task<IActionResult> GetJobListings(int Page = 1, int PageQuantity = 25) {
JobListing[] jobListings = await _databaseService.GetJobListingPage(Page, PageQuantity);
return Ok(jobListings);
}
[HttpPost]
public async Task<IActionResult> SetJobListing([FromBody] JobListing JobListing) {
if (isLoggedIn()) {
if (await isLoggedInUserEmployeeOf(JobListing.CompanyID)) {
await _databaseService.SetJobListing(JobListing);
}
}
return NotFound();
}
[HttpDelete]
public async Task<IActionResult> DeleteJobListing(int JobListingID) {
if (isLoggedIn()) {
JobListing? jobListing = await _databaseService.GetJobListing(JobListingID);
if (jobListing != null) {
if (await isLoggedInUserEmployeeOf(JobListingID)) {
await _databaseService.DeleteJobListing(JobListingID);
}
}
}
return NotFound();
}
}
}
@@ -35,6 +35,16 @@ namespace BoredCareers.Controllers {
}
}
public async Task<bool> isLoggedInUserEmployeeOf(int CompanyID) {
Employee[] employees = await _databaseService.GetEmployees(CompanyID);
foreach (Employee cur in employees) {
if (getLoggedInUserID() == cur.AccountID) {
return true;
}
}
return false;
}
public string Substitue(string message, string subString, string Replacement) {
for (int i = 0; i < (message.Length - subString.Length); i++) {
if (message.Substring(i, subString.Length) == subString) {
+3 -30
View File
@@ -1,11 +1,10 @@
using Microsoft.AspNetCore.Mvc;
using BoredCareers.Controllers.Payment;
using BoredCareers.Services.DatabaseService;
using BoredCareers.Entities;
namespace BoredCareers.Controllers {
[ApiController]
[Route("api/payment/[controller]")]
[Route("api/payment")]
public class PaymentController : MistoxControllerBase {
IPayment _paymentService;
@@ -20,37 +19,11 @@ namespace BoredCareers.Controllers {
// Add new payment plugins here
}
[Route("getcheckouttoken")]
[HttpPost]
public async Task<string> GetCheckoutToken() {
string OrderNumber = Guid.NewGuid().ToString().Substring(0, 10);
if (isLoggedIn()) {
Cart[] carts = await _databaseService.GetCart(getLoggedInUserID());
(bool, string) PaymentResponse = await _paymentService.TryGetCheckoutToken(OrderNumber, getLoggedInUserID(), carts);
if (PaymentResponse.Item1) {
// Returns client secret
return PaymentResponse.Item2;
} else {
Console.WriteLine("An error has occured in the payment plugin\n\n");
Console.WriteLine(PaymentResponse.Item2);
Console.WriteLine("\n");
return "An error has occured in the payment plugin";
}
}
return "You must be logged in";
}
[Route("getpublickey")]
[HttpPost]
[HttpGet]
public IActionResult GetPublicKey() {
try {
return Ok(IPayment._PublicKey);
} catch (Exception ex) {
return NotFound(ex.ToString());
}
return Ok(IPayment._PublicKey);
}
[Route("response")]
[HttpPost]
public async Task<IActionResult> paymentWebhook() {
try {
@@ -8,7 +8,6 @@ namespace BoredCareers.Controllers.Payment {
public static string _EndpointSecret = "";
public static string _PublicKey = "";
public Task<(bool, string)> TryGetCheckoutToken(string OrderNumber, int userID, Cart[] cart);
public Task ValidatePurchase(string WebHookData, string Headers);
}
@@ -1,6 +1,5 @@
using BoredCareers.Controllers.Payment;
using BoredCareers.Services.DatabaseService;
using BoredCareers.Entities;
namespace BoredCareers.Controllers {
@@ -12,72 +11,6 @@ namespace BoredCareers.Controllers {
_databaseService = databaseService;
}
public async Task<(bool, string)> TryGetCheckoutToken(string OrderNumber, int userID, Cart[] cart) {
try {
// build Recipt and calculate Tax
var options = new Stripe.Tax.CalculationCreateOptions {
Currency = "usd",
CustomerDetails = new Stripe.Tax.CalculationCustomerDetailsOptions {
AddressSource = "billing",
},
Expand = new List<string>() { "line_items" },
LineItems = new List<Stripe.Tax.CalculationLineItemOptions>()
};
List<int> prods = new List<int>();
// Add items to receipt
int subtotal = 0;
foreach (Cart items in cart) {
Product? product = await _databaseService.GetProduct(items.ProductID);
if (product != null) {
prods.Add(product.ID);
if (product != null) {
subtotal += product.Cost;
options.LineItems.Add(new Stripe.Tax.CalculationLineItemOptions {
Amount = product.Cost,
TaxCode = "txcd_10201000", // Tax code for downloadable digital games
Quantity = 1,
Reference = product.Name,
TaxBehavior = "exclusive"
});
}
}
}
var service = new Stripe.Tax.CalculationService();
Stripe.Tax.Calculation result = service.Create(options);
string csv = "";
foreach (int cur in prods) {
csv = csv + cur + ",";
}
// Crate Payment Intent
Stripe.PaymentIntentCreateOptions paymentIntent = new Stripe.PaymentIntentCreateOptions() {
Amount = result.AmountTotal,
Currency = "usd",
Metadata = new Dictionary<string, string> {
{ "ordernumber", OrderNumber },
{ "user", userID.ToString() },
{ "products", csv },
{ "subtotal", subtotal.ToString() },
{ "total", result.AmountTotal.ToString() }
},
StatementDescriptor = "Mistox.Net #" + OrderNumber
};
Stripe.PaymentIntentService intentService = new Stripe.PaymentIntentService();
Stripe.PaymentIntent x = await intentService.CreateAsync(paymentIntent);
return (true, x.ClientSecret);
} catch (Exception e) {
return (false, e.ToString());
}
}
public async Task ValidatePurchase(string WebHookData, string Headers) {
Stripe.Event e = Stripe.EventUtility.ConstructEvent( WebHookData, Headers, IPayment._EndpointSecret );
if (e.Type == "payment_intent.succeeded") {
@@ -114,22 +47,7 @@ namespace BoredCareers.Controllers {
}
}
// Clear the cart
await _databaseService.ClearCart(userID);
// Add data to misox receipt
for (int i = 0; i < productIDs.Count; i++) {
int product = productIDs[i];
await _databaseService.NewReceipt(new Receipt {
AccountID = userID,
ProductID = product,
ReceiptID = orderNumber,
Time = DateTime.Now,
TaxAmount = total - subtotal,
TotalCost = total,
LineItem = i
});
}
} else {
Console.WriteLine("Unhandled event type: {0}", e.Type);
}
-143
View File
@@ -1,143 +0,0 @@
using Microsoft.AspNetCore.Mvc;
using BoredCareers.Services.DatabaseService;
using BoredCareers.Entities;
namespace BoredCareers.Controllers {
[ApiController]
[Route("api/product/[controller]")]
public class ProductController : MistoxControllerBase {
public ProductController(DatabaseService db) : base(db) { }
[Route("set")]
[HttpPost]
public async Task<ActionResult<bool>> CreateProduct([FromForm] Product obj, [FromForm] IFormFile[] images) {
try {
if (isLoggedIn()) {
Account user = await getLoggedInUser();
if (user.Role == "Admin") {
List<ProductImage> building = new List<ProductImage>();
foreach (var file in images) {
using (var stream = new MemoryStream()) {
await file.CopyToAsync(stream);
var bytes = stream.ToArray();
// Convert to your image model or whatever your logic is
ProductImage img = new ProductImage { Image = bytes, Name = file.FileName };
building.Add(img);
}
}
obj.Images = building.ToArray();
await _databaseService.SetProduct(obj);
return true;
}
}
return false;
} catch (Exception e) {
Console.WriteLine(e);
return false;
}
}
[Route("get")]
[HttpPost]
public async Task<ActionResult<Product>> GetProduct([FromForm] int productID) {
try {
Product? product = await _databaseService.GetProduct(productID);
if (product != null) {
return product;
}
else {
return NotFound();
}
} catch {
return NotFound();
}
}
[Route("getall")]
[HttpPost]
public async Task<Product[]> GetAllProducts() {
try {
return await _databaseService.GetAllProducts();
} catch {
return Array.Empty<Product>();
}
}
[Route("delete")]
[HttpPost]
public async Task<ActionResult<bool>> DeleteProduct([FromForm] int productID) {
try {
if (isLoggedIn()) {
Account user = await getLoggedInUser();
if (user.Role == "Admin") {
await _databaseService.DeleteProduct(productID);
return true;
}
}
return false;
} catch {
return false;
}
}
[Route("getimage")]
[HttpPost]
public async Task<IActionResult> GetProductImage([FromForm] int ProductID, [FromForm] int ImageID) {
try {
ProductImage? img = await _databaseService.GetImage(ProductID, ImageID);
if (img != null) {
return File(img.Image, "Image/*");
}
else {
return NotFound();
}
} catch {
return NotFound();
}
}
[Route("getowned")]
[HttpPost]
public async Task<ActionResult<Receipt[]>> GetOwnedProduct() {
try {
if (isLoggedIn()) {
Receipt[] returned = await _databaseService.GetAllReceipts(getLoggedInUserID());
return returned;
}
return new Receipt[0];
} catch {
return new Receipt[0];
}
}
[Route("download")]
[HttpGet]
public async Task<ActionResult> Download([FromQuery] string Product) {
try {
if (isLoggedIn()) {
Product[] games = await _databaseService.GetAllProducts();
foreach (Product product in games) {
if (contains(Product, product.URL)) {
Receipt? receipt = await _databaseService.GetReceipt(getLoggedInUserID(), product.ID);
if (receipt != null) {
//FileStream fileStream = new FileStream(_FolderRoot + Product, FileMode.Open, FileAccess.Read);
//return new FileStreamResult( fileStream, "application/octet-stream" ) {
// FileDownloadName = fileStream.Name
//};
}
break;
}
}
return Unauthorized();
}
return Unauthorized();
} catch {
return NotFound();
}
}
}
}
@@ -0,0 +1,56 @@
using Microsoft.AspNetCore.Mvc;
using BoredCareers.Services.DatabaseService;
using BoredCareers.Entities;
using System.Web.Http;
namespace BoredCareers.Controllers {
[ApiController]
[Route("api/resume")]
public class ResumeController : MistoxControllerBase {
public ResumeController(DatabaseService db) : base(db) {}
[HttpGet]
public async Task<IActionResult> GetResume(int? ResumeID) {
if (ResumeID != null) {
Resume? resume = await _databaseService.GetResume(ResumeID.Value);
if (resume != null) {
return Ok(resume);
}
}else{
if (isLoggedIn()) {
int accountID = getLoggedInUserID();
Resume[] resumes = await _databaseService.GetResumes(accountID);
return Ok(resumes);
}
}
return NotFound();
}
[HttpPost]
public async Task<IActionResult> SetResume([FromBody] Resume resume) {
if (isLoggedIn()) {
int AccountID = getLoggedInUserID();
if (resume.AccountID == AccountID) {
await _databaseService.SetResume(resume);
return Ok();
}
}
return NotFound();
}
[HttpDelete]
public async Task<IActionResult> DeleteResume(int ResumeID) {
if (isLoggedIn()){
int accountID = getLoggedInUserID();
Resume? resume = await _databaseService.GetResume(ResumeID);
if (resume != null && resume.AccountID == accountID) {
await _databaseService.DeleteResume(ResumeID);
return Ok();
}
}
return NotFound();
}
}
}
+2 -11
View File
@@ -15,19 +15,10 @@ namespace BoredCareers.Entities {
public string Description { get; set; } = "";
}
public class JobListing {
public class Employee {
public int ID { get; set; } // PK
public int AccountID { get; set; } // FK
public int CompanyID { get; set; } // FK
public string Title { get; set; } = "";
public string PostalCode { get; set; } = "";
public string Country { get; set; } = ""; // 2 Letter Country Code
public string StateOrRegion { get; set; } = "";
public string City { get; set; } = "";
public int SalaryMin { get; set; } = 0;
public int SalaryMax { get; set; } = 0;
public string JobType { get; set; } = "";
public bool Remote { get; set; } = false;
public string Description { get; set; } = "";
}
}
+21
View File
@@ -0,0 +1,21 @@
namespace BoredCareers.Entities {
public class JobListing {
public int ID { get; set; } // PK
public int CompanyID { get; set; } // FK
public string Title { get; set; } = "";
public string PostalCode { get; set; } = "";
public string Country { get; set; } = ""; // 2 Letter Country Code
public string StateOrRegion { get; set; } = "";
public string City { get; set; } = "";
public int SalaryMin { get; set; } = 0;
public int SalaryMax { get; set; } = 0;
public string JobType { get; set; } = "";
public bool Remote { get; set; } = false;
public string Description { get; set; } = "";
public DateTime CreatedTime { get; set; }
public DateTime ModifiedTime { get; set; }
public bool IsDeleted { get; set; } = false;
}
}
+15 -4
View File
@@ -12,6 +12,13 @@ namespace BoredCareers.Entities {
public string StateOrRegion { get; set; } = "";
public string City { get; set; } = "";
public bool IsActive { get; set; } = false;
public ResumeExperience[] Experience { get; set; } = [];
public ResumeMilitary Millitary { get; set; } = new ResumeMilitary();
public ResumeEducation[] Educations { get; set; } = [];
public ResumeSkill[] Skills { get; set; } = [];
public ResumeLanguage[] Languages { get; set; } = [];
public ResumeCertification[] Certification { get; set; } = [];
public ResumeProject[] Projects { get; set; } = [];
}
public class ResumeExperience {
@@ -26,15 +33,17 @@ namespace BoredCareers.Entities {
public DateTime DateStarted { get; set; } = new DateTime();
public bool StillEmployed { get; set; } = false;
public DateTime DateEnded { get; set; } = new DateTime();
public ResumeExperienceBullet[] ExperienceBullets { get; set; } = [];
}
public class ResumeExperienceBullet {
public int ID { get; set; } // PK
public int ResumeID { get; set; } // FK
public int ResumeExperienceID { get; set; } // FK
public string JobFunction { get; set; } = "";
}
public class ResumeMillitary {
public class ResumeMilitary {
public int ID { get; set; } // PK
public int ResumeID { get; set; } // FK
public string Country { get; set; } = ""; // 2 Letter Country Code
@@ -42,12 +51,14 @@ namespace BoredCareers.Entities {
public DateTime DateStarted { get; set; } = new DateTime();
public bool StillServing { get; set; } = false;
public DateTime DateEnded { get; set; } = new DateTime();
public ResumeMilitaryBullet[] MillitaryBullets = [];
}
public class ResumeMillitaryBullet {
public class ResumeMilitaryBullet {
public int ID { get; set; } // PK
public int ResumeMillitaryID { get; set; } // FK
public string Achevement { get; set; } = "";
public int ResumeID { get; set; } // FK
public int ResumeMilitaryID { get; set; } // FK
public string Achievement { get; set; } = "";
public string Description { get; set; } = "";
}
+22 -3
View File
@@ -2,7 +2,9 @@ using Microsoft.AspNetCore.Authentication.Cookies;
using BoredCareers.Controllers.Payment;
using BoredCareers.Services;
using BoredCareers.Services.DatabaseService;
using System.Threading.RateLimiting;
using Stripe;
using System.Security.Claims;
var builder = WebApplication.CreateBuilder(args);
@@ -90,9 +92,26 @@ builder.Services.AddAuthentication( options => {
options.SlidingExpiration = true;
});
builder.Services.AddCors( o => o.AddDefaultPolicy( builder => {
builder.Services.AddCors(o => o.AddDefaultPolicy(builder => {
builder.AllowAnyOrigin().AllowAnyMethod().AllowAnyHeader(); // No CORS
} ) );
}));
builder.Services.AddRateLimiter(options => {
options.AddPolicy("PerUserPolicy", httpContext => {
var userId = httpContext.User.FindFirst(ClaimTypes.NameIdentifier)?.Value
?? httpContext.User.Identity?.Name
?? httpContext.Connection.RemoteIpAddress?.ToString();
return RateLimitPartition.GetTokenBucketLimiter(userId, key => new TokenBucketRateLimiterOptions {
TokenLimit = 10, // max 10 requests
QueueProcessingOrder = QueueProcessingOrder.OldestFirst,
QueueLimit = 0,
ReplenishmentPeriod = TimeSpan.FromSeconds(15),
TokensPerPeriod = 2,
AutoReplenishment = true
});
});
});
// Pages Service
builder.Services.AddControllers();
@@ -113,7 +132,7 @@ app.UseCors();
app.UseRouting();
app.UseAuthentication();
app.MapControllers();
app.MapControllers().RequireRateLimiting("perUserPolicy");
app.MapFallbackToFile("index.html");
@@ -21,10 +21,7 @@ namespace BoredCareers.Services.DatabaseService {
using( DbDataReader reader = await cmd.ExecuteReaderAsync() ) {
while( await reader.ReadAsync() ) {
if( reader == null ) {
break;
}
if( reader == null ) { break; }
int _id = reader.GetInt32("ID");
string _username = reader.GetString("UserName");
string _email = reader.GetString("Email");
@@ -56,7 +53,7 @@ namespace BoredCareers.Services.DatabaseService {
return account;
}
public async Task<Account?> GetAccount( int ID ) {
public async Task<Account?> GetAccount( int AccountID ) {
Account? account = null;
using( MySqlConnection connection = GetConnection() ) {
connection.Open();
@@ -67,7 +64,7 @@ namespace BoredCareers.Services.DatabaseService {
";
MySqlCommand cmd = new MySqlCommand(command, connection);
cmd.Parameters.AddWithValue("@ID", ID);
cmd.Parameters.AddWithValue("@ID", AccountID);
using( DbDataReader reader = await cmd.ExecuteReaderAsync() ) {
while( await reader.ReadAsync() ) {
@@ -144,7 +141,7 @@ namespace BoredCareers.Services.DatabaseService {
}
}
public async Task DeleteAccount( int ID ) {
public async Task DeleteAccount( int AccountID ) {
using( MySqlConnection connection = GetConnection() ) {
MySqlCommand cmd;
connection.Open();
@@ -153,7 +150,7 @@ namespace BoredCareers.Services.DatabaseService {
DELETE FROM Account WHERE ID = @ID;
";
cmd = new MySqlCommand( command, connection );
cmd.Parameters.AddWithValue("@ID", ID);
cmd.Parameters.AddWithValue("@ID", AccountID);
await cmd.ExecuteNonQueryAsync();
}
@@ -0,0 +1,115 @@
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<Company?> GetCompany( int CompanyID ) {
Company? company = null;
using( MySqlConnection connection = GetConnection() ) {
connection.Open();
string command = @"
SELECT *
FROM Company
WHERE ID = @ID;
";
MySqlCommand cmd = new MySqlCommand(command, connection);
cmd.Parameters.AddWithValue("@ID", CompanyID);
using( DbDataReader reader = await cmd.ExecuteReaderAsync() ) {
while( await reader.ReadAsync() ) {
if( reader == null ) { break; }
int _id = reader.GetInt32("ID");
string _name = reader.GetString("Name");
string _email = reader.GetString("Email");
bool _emailVerified = reader.GetBoolean("EmailVerified");
string _websiteurl = reader.GetString("WebsiteURL");
string _logourl = reader.GetString( "LogoURL" );
string _phone = reader.GetString( "Phone" );
string _postalcode = reader.GetString( "PostalCode" );
string _country = reader.GetString( "Country" );
string _state = reader.GetString( "StateOrRegion" );
string _city = reader.GetString( "City" );
string _description = reader.GetString( "Description" );
company = new Company() {
ID = _id,
Name = _name,
Email = _email,
EmailVerified = _emailVerified,
WebsiteURL = _websiteurl,
LogoURL = _logourl,
Phone = _phone,
PostalCode = _postalcode,
Country = _country,
StateOrRegion = _state,
City = _city,
Description = _description
};
}
}
}
return company;
}
public async Task SetCompany( Company company ) {
using( MySqlConnection connection = GetConnection() ) {
connection.Open();
string command = @"
INSERT INTO Account
(ID,Name,Email,EmailVerified,WebsiteURL,LogoURL,Phone,PostalCode,Country,StateOrRegion,City,Description)
VALUES
(@ID,@Name,@Email,@EmailVerified,@WebsiteURL,@LogoURL,@Phone,@PostalCode,@Country,@StateOrRegion,@City,@Description);
ON DUPLICATE KEY UPDATE
Name = @Name,
Email = @Email,
EmailVerified = @EmailVerified,
WebsiteURL = @WebsiteURL,
LogoURL = @LogoURL,
Phone = @Phone,
PostalCode = @PostalCode,
Country = @Country,
StateOrRegion = @StateOrRegion;
City = @City,
Description = @Description;
";
MySqlCommand cmd = new MySqlCommand( command , connection);
cmd.Parameters.AddWithValue("@ID", company.ID);
cmd.Parameters.AddWithValue("@Name", company.Name);
cmd.Parameters.AddWithValue("@Email", company.Email);
cmd.Parameters.AddWithValue("@EmailVerified", company.EmailVerified);
cmd.Parameters.AddWithValue("@WebsiteURL", company.WebsiteURL);
cmd.Parameters.AddWithValue("@LogoURL", company.LogoURL);
cmd.Parameters.AddWithValue("@Phone", company.Phone);
cmd.Parameters.AddWithValue("@PostalCode", company.PostalCode);
cmd.Parameters.AddWithValue("@Country", company.Country);
cmd.Parameters.AddWithValue("@StateOrRegion", company.StateOrRegion);
cmd.Parameters.AddWithValue("@City", company.City);
cmd.Parameters.AddWithValue("@Description", company.Description);
await cmd.ExecuteNonQueryAsync();
}
}
public async Task DeleteCompany( int CompanyID ) {
using( MySqlConnection connection = GetConnection() ) {
MySqlCommand cmd;
connection.Open();
string command = @"
DELETE FROM Company WHERE ID = @ID;
";
cmd = new MySqlCommand( command, connection );
cmd.Parameters.AddWithValue("@ID", CompanyID);
await cmd.ExecuteNonQueryAsync();
}
}
}
}
@@ -0,0 +1,79 @@
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<Employee[]> GetEmployees( int CompanyID ) {
List<Employee> employees = new List<Employee>();
using( MySqlConnection connection = GetConnection() ) {
connection.Open();
string command = @"
SELECT *
FROM Employee
WHERE ID = @ID;
";
MySqlCommand cmd = new MySqlCommand(command, connection);
cmd.Parameters.AddWithValue("@ID", CompanyID);
using( DbDataReader reader = await cmd.ExecuteReaderAsync() ) {
while( await reader.ReadAsync() ) {
if( reader == null ) { break; }
int _id = reader.GetInt32("ID");
int _accountid = reader.GetInt32("AccountID");
int _companyid = reader.GetInt32("CompanyID");
employees.Add(new Employee() {
ID = _id,
AccountID = _accountid,
CompanyID = _companyid
});
}
}
}
return employees.ToArray();
}
public async Task SetEmployee( Employee employee ) {
using( MySqlConnection connection = GetConnection() ) {
connection.Open();
string command = @"
INSERT INTO Employee
(ID,AccountID,CompanyID)
VALUES
(@ID,@AccountID,@CompanyID);
ON DUPLICATE KEY UPDATE
AccountID = @AccountID,
CompanyID = @CompanyID;
";
MySqlCommand cmd = new MySqlCommand( command , connection);
cmd.Parameters.AddWithValue("@ID", employee.ID);
cmd.Parameters.AddWithValue("@AccountID", employee.AccountID);
cmd.Parameters.AddWithValue("@CompanyID", employee.CompanyID);
await cmd.ExecuteNonQueryAsync();
}
}
public async Task DeleteEmployee( int EmployeeID ) {
using( MySqlConnection connection = GetConnection() ) {
MySqlCommand cmd;
connection.Open();
string command = @"
DELETE FROM Employee WHERE ID = @ID;
";
cmd = new MySqlCommand( command, connection );
cmd.Parameters.AddWithValue("@ID", EmployeeID);
await cmd.ExecuteNonQueryAsync();
}
}
}
}
@@ -0,0 +1,187 @@
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<JobListing[]> GetJobListingPage(int PageNumber, int CountPerPage) {
List<JobListing> joblistings = new List<JobListing>();
using (MySqlConnection connection = GetConnection()) {
connection.Open();
string command = @"
SELECT *
FROM JobListing
WHERE IsDeleted = FALSE
ORDER BY CreatedTime DESC
LIMIT @PageSize OFFSET @PageNumber;
";
MySqlCommand cmd = new MySqlCommand(command, connection);
cmd.Parameters.AddWithValue("@PageSize", CountPerPage);
cmd.Parameters.AddWithValue("@PageNumber", (PageNumber - 1) * CountPerPage);
using (DbDataReader reader = await cmd.ExecuteReaderAsync()) {
while (await reader.ReadAsync()) {
if (reader == null) { break; }
int _id = reader.GetInt32("ID");
int _companyid = reader.GetInt32("CompanyID");
string _title = reader.GetString("Title");
string _postalcode = reader.GetString("PostalCode");
string _country = reader.GetString("Country");
string _state = reader.GetString("StateOrRegion");
string _city = reader.GetString("City");
int _salarymin = reader.GetInt32("SalaryMin");
int _salarymax = reader.GetInt32("SalaryMax");
string _jobtype = reader.GetString("JobType");
bool _remote = reader.GetBoolean("Remote");
string _description = reader.GetString("Description");
DateTime _createtime = reader.GetDateTime("CreatedTime");
DateTime _modifiedtime = reader.GetDateTime("ModifiedTime");
bool _isdeleted = reader.GetBoolean("IsDeleted");
joblistings.Add(new JobListing() {
ID = _id,
CompanyID = _companyid,
Title = _title,
PostalCode = _postalcode,
Country = _country,
StateOrRegion = _state,
City = _city,
SalaryMin = _salarymin,
SalaryMax = _salarymax,
JobType = _jobtype,
Remote = _remote,
Description = _description,
CreatedTime = _createtime,
ModifiedTime = _modifiedtime,
IsDeleted = _isdeleted
});
}
}
}
return joblistings.ToArray();
}
public async Task<JobListing?> GetJobListing(int JobListingID) {
JobListing? joblisting = null;
using (MySqlConnection connection = GetConnection()) {
connection.Open();
string command = @"
SELECT *
FROM JobListing
WHERE ID = @ID;
";
MySqlCommand cmd = new MySqlCommand(command, connection);
cmd.Parameters.AddWithValue("@ID", JobListingID);
using (DbDataReader reader = await cmd.ExecuteReaderAsync()) {
while (await reader.ReadAsync()) {
if (reader == null) { break; }
int _id = reader.GetInt32("ID");
int _companyid = reader.GetInt32("CompanyID");
string _title = reader.GetString("Title");
string _postalcode = reader.GetString("PostalCode");
string _country = reader.GetString("Country");
string _state = reader.GetString("StateOrRegion");
string _city = reader.GetString("City");
int _salarymin = reader.GetInt32("SalaryMin");
int _salarymax = reader.GetInt32("SalaryMax");
string _jobtype = reader.GetString("JobType");
bool _remote = reader.GetBoolean("Remote");
string _description = reader.GetString("Description");
DateTime _createtime = reader.GetDateTime("CreatedTime");
DateTime _modifiedtime = reader.GetDateTime("ModifiedTime");
bool _isdeleted = reader.GetBoolean("IsDeleted");
joblisting = new JobListing() {
ID = _id,
CompanyID = _companyid,
Title = _title,
PostalCode = _postalcode,
Country = _country,
StateOrRegion = _state,
City = _city,
SalaryMin = _salarymin,
SalaryMax = _salarymax,
JobType = _jobtype,
Remote = _remote,
Description = _description,
CreatedTime = _createtime,
ModifiedTime = _modifiedtime,
IsDeleted = _isdeleted
};
}
}
}
return joblisting;
}
public async Task SetJobListing( JobListing jobListing ) {
using( MySqlConnection connection = GetConnection() ) {
connection.Open();
string command = @"
INSERT INTO JobListing
(ID,CompanyID,Title,PostalCode,Country,StateOrRegion,City,SalaryMin,SalaryMax,JobType,Remote,Description,CreatedTime,ModifiedTime,IsDeleted)
VALUES
(@ID,@CompanyID,@Title,@PostalCode,@Country,@StateOrRegion,@City,@SalaryMin,@SalaryMax,@JobType,@Remote,@Description,@CreatedTime,@ModifiedTime,@IsDeleted);
ON DUPLICATE KEY UPDATE
CompanyID = @CompanyID,
Title = @Title,
PostalCode = @PostalCode,
Country = @Country,
StateOrRegion = @StateOrRegion,
City = @City,
SalaryMin = @SalaryMin,
SalaryMax = @SalaryMax,
JobType = @JobType,
Remote = @Remote,
Description = @Description,
CreatedTime = @CreatedTime,
ModifiedTime = @ModifiedTime,
IsDeleted = @IsDeleted;
";
MySqlCommand cmd = new MySqlCommand( command , connection);
cmd.Parameters.AddWithValue("@ID", jobListing.ID);
cmd.Parameters.AddWithValue("@CompanyID", jobListing.CompanyID);
cmd.Parameters.AddWithValue("@Title", jobListing.Title);
cmd.Parameters.AddWithValue("@PostalCode", jobListing.PostalCode);
cmd.Parameters.AddWithValue("@Country", jobListing.Country);
cmd.Parameters.AddWithValue("@StateOrRegion", jobListing.StateOrRegion);
cmd.Parameters.AddWithValue("@City", jobListing.City);
cmd.Parameters.AddWithValue("@SalaryMin", jobListing.SalaryMin);
cmd.Parameters.AddWithValue("@SalaryMax", jobListing.SalaryMax);
cmd.Parameters.AddWithValue("@JobType", jobListing.JobType);
cmd.Parameters.AddWithValue("@Remote", jobListing.Remote);
cmd.Parameters.AddWithValue("@Description", jobListing.Description);
cmd.Parameters.AddWithValue("@CreatedTime", jobListing.CreatedTime.ToUniversalTime());
cmd.Parameters.AddWithValue("@ModifiedTime", jobListing.ModifiedTime.ToUniversalTime());
cmd.Parameters.AddWithValue("@IsDeleted", jobListing.IsDeleted);
await cmd.ExecuteNonQueryAsync();
}
}
public async Task DeleteJobListing( int JobListingID ) {
using( MySqlConnection connection = GetConnection() ) {
MySqlCommand cmd;
connection.Open();
string command = @"
UPDATE JobListing
SET IsDeleted = TRUE
WHERE ID = @ID;
";
cmd = new MySqlCommand( command, connection );
cmd.Parameters.AddWithValue("@ID", JobListingID);
await cmd.ExecuteNonQueryAsync();
}
}
}
}
@@ -0,0 +1,236 @@
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<Resume[]> GetResumes(int AccountID) {
List<Resume> resumes = new List<Resume>();
using (MySqlConnection connection = GetConnection()) {
connection.Open();
string command = @"
SELECT *
FROM Resume
WHERE AccountID = @AccountID;
";
MySqlCommand cmd = new MySqlCommand(command, connection);
cmd.Parameters.AddWithValue("@AccountID", AccountID);
using (DbDataReader reader = await cmd.ExecuteReaderAsync()) {
while (await reader.ReadAsync()) {
if (reader == null) {
break;
}
int _id = reader.GetInt32("ID");
int _accountid = reader.GetInt32("AccountID");
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");
resumes.Add( new Resume() {
ID = _id,
AccountID = _accountid,
Name = _name,
Field = _field,
Email = _email,
PhoneNumber = _phonenumber,
PostalCode = _postalcode,
Country = _country,
StateOrRegion = _state,
City = _city,
IsActive = _isactive
} );
}
}
}
return resumes.ToArray();
}
public async Task<Resume?> GetResume(int ResumeID) {
// Open connections for multi-threaded request
MySqlConnection resumeConnection = GetConnection();
MySqlConnection ResumeExperienceConnection = GetConnection();
MySqlConnection ResumeExperienceBulletConnection = GetConnection();
MySqlConnection ResumeMilitaryConnection = GetConnection();
MySqlConnection ResumeMilitaryBulletConnection = GetConnection();
MySqlConnection ResumeEducationConnection = GetConnection();
MySqlConnection ResumeSkillConnection = GetConnection();
MySqlConnection ResumeLanguageConnection = GetConnection();
MySqlConnection ResumeCertificationConnection = GetConnection();
MySqlConnection ResumeProjectConnection = GetConnection();
// Open the connections
Task resumeopen = resumeConnection.OpenAsync();
Task resumeexperienceopen = ResumeExperienceConnection.OpenAsync();
Task resumeexperiencebulletopen = ResumeExperienceBulletConnection.OpenAsync();
Task resumemilitaryopen = ResumeMilitaryConnection.OpenAsync();
Task resumemilitarybulletopen = ResumeMilitaryBulletConnection.OpenAsync();
Task resumeeducationopen = ResumeEducationConnection.OpenAsync();
Task resumeskillopen = ResumeSkillConnection.OpenAsync();
Task resumelanguageopen = ResumeLanguageConnection.OpenAsync();
Task resumecertifcationopen = ResumeCertificationConnection.OpenAsync();
Task resumeprojectopen = ResumeProjectConnection.OpenAsync();
// Wait for all the connections to open
await Task.WhenAll(resumeopen, resumeexperienceopen, resumeexperiencebulletopen, resumemilitaryopen, resumemilitarybulletopen,
resumeeducationopen, resumeskillopen, resumelanguageopen, resumecertifcationopen, resumeprojectopen);
// Setup the commands for the connections
MySqlCommand resumeCommand = new MySqlCommand("SELECT * FROM Resume WHERE ID = @ResumeID;", resumeConnection);
MySqlCommand ResumeExperienceCommand = new MySqlCommand("SELECT * FROM ResumeExperience WHERE ResumeID = @ResumeID;", ResumeExperienceConnection);
MySqlCommand ResumeExperienceBulletCommand = new MySqlCommand("SELECT * FROM ResumeExperienceBullet WHERE ResumeID = @ResumeID;", ResumeExperienceBulletConnection);
MySqlCommand ResumeMilitaryCommand = new MySqlCommand("SELECT * FROM ResumeMilitary WHERE ResumeID = @ResumeID;", ResumeMilitaryConnection);
MySqlCommand ResumeMilitaryBulletCommand = new MySqlCommand("SELECT * FROM ResumeMilitaryBullet WHERE ResumeID = @ResumeID", ResumeMilitaryBulletConnection);
MySqlCommand ResumeEducationCommand = new MySqlCommand("SELECT * FROM ResumeEducation WHERE ResumeID = @ResumeID;", ResumeEducationConnection);
MySqlCommand ResumeSkillCommand = new MySqlCommand("SELECT * FROM ResumeSkill WHERE ResumeID = @ResumeID;", ResumeSkillConnection);
MySqlCommand ResumeLanguageCommand = new MySqlCommand("SELECT * FROM ResumeLanguage WHERE ResumeID = @ResumeID;", ResumeLanguageConnection);
MySqlCommand ResumeCertificationCommand = new MySqlCommand("SELECT * FROM ResumeCertification WHERE ResumeID = @ResumeID;", ResumeCertificationConnection);
MySqlCommand ResumeProjectCommand = new MySqlCommand("SELECT * FROM ResumeProject WHERE ResumeID = @ResumeID;", ResumeProjectConnection);
// Add parameters to the commands
resumeCommand.Parameters.AddWithValue("@ResumeID", ResumeID);
ResumeExperienceCommand.Parameters.AddWithValue("@ResumeID", ResumeID);
ResumeExperienceBulletCommand.Parameters.AddWithValue("@ResumeID", ResumeID);
ResumeMilitaryCommand.Parameters.AddWithValue("@ResumeID", ResumeID);
ResumeMilitaryBulletCommand.Parameters.AddWithValue("@ResumeID", ResumeID);
ResumeEducationCommand.Parameters.AddWithValue("@ResumeID", ResumeID);
ResumeSkillCommand.Parameters.AddWithValue("@ResumeID", ResumeID);
ResumeLanguageCommand.Parameters.AddWithValue("@ResumeID", ResumeID);
ResumeCertificationCommand.Parameters.AddWithValue("@ResumeID", ResumeID);
ResumeProjectCommand.Parameters.AddWithValue("@ResumeID", ResumeID);
// Run the commands
Task<DbDataReader> ResumeReader = resumeCommand.ExecuteReaderAsync();
Task<DbDataReader> ResumeExperienceReader = ResumeExperienceCommand.ExecuteReaderAsync();
Task<DbDataReader> ResumeExperienceBulletReader = ResumeExperienceBulletCommand.ExecuteReaderAsync();
Task<DbDataReader> ResumeMilitaryReader = ResumeMilitaryCommand.ExecuteReaderAsync();
Task<DbDataReader> ResumeMilitaryBulletReader = ResumeMilitaryBulletCommand.ExecuteReaderAsync();
Task<DbDataReader> ResumeEducationReader = ResumeEducationCommand.ExecuteReaderAsync();
Task<DbDataReader> ResumeSkillReader = ResumeSkillCommand.ExecuteReaderAsync();
Task<DbDataReader> ResumeLanguageReader = ResumeLanguageCommand.ExecuteReaderAsync();
Task<DbDataReader> ResumeCertificationReader = ResumeCertificationCommand.ExecuteReaderAsync();
Task<DbDataReader> ResumeProjectReader = ResumeProjectCommand.ExecuteReaderAsync();
// Wait for all the commands to process
await Task.WhenAll(ResumeReader, ResumeExperienceReader, ResumeExperienceBulletReader, ResumeMilitaryReader, ResumeMilitaryBulletReader,
ResumeEducationReader, ResumeSkillReader, ResumeLanguageReader, ResumeCertificationReader, ResumeProjectReader);
// Get Resume
Resume? resume = await GetResume( await ResumeReader );
if (resume != null) {
// Get Resume Parts
ResumeExperience[] experience = await GetResumeExperience(await ResumeExperienceReader);
ResumeExperienceBullet[] experienceBullets = await GetResumeExperienceBullets(await ResumeExperienceBulletReader);
ResumeMilitary? military = await GetResumeMilitary(await ResumeMilitaryReader);
ResumeMilitaryBullet[] militaryBullets = await GetResumeMilitaryBullets(await ResumeMilitaryBulletReader);
ResumeEducation[] education = await GetResumeEducation(await ResumeEducationReader);
ResumeSkill[] skills = await GetResumeSkills(await ResumeSkillReader);
ResumeLanguage[] languages = await GetResumeLanguages(await ResumeLanguageReader);
ResumeCertification[] certs = await GetResumeCertification(await ResumeCertificationReader);
ResumeProject[] projects = await GetResumeProjects(await ResumeProjectReader);
// Split into grouped lists and add to experience
Dictionary<int, ResumeExperienceBullet[]> groupedExperienceBullets = experienceBullets.GroupBy(b => b.ResumeExperienceID).ToDictionary(g => g.Key, g => g.ToArray());
foreach (ResumeExperience cur in experience) {
cur.ExperienceBullets = groupedExperienceBullets[cur.ID];
}
// Add the parts to the resume
if (military != null) {
military.MillitaryBullets = militaryBullets;
resume.Millitary = military;
}
resume.Experience = experience;
resume.Educations = education;
resume.Skills = skills;
resume.Languages = languages;
resume.Certification = certs;
resume.Projects = projects;
return resume;
}
return null;
}
public async Task SetResume(Resume resume) {
// Open connections for multi-threaded request
MySqlConnection resumeConnection = GetConnection();
MySqlConnection ResumeExperienceConnection = GetConnection();
MySqlConnection ResumeExperienceBulletConnection = GetConnection();
MySqlConnection ResumeMilitaryConnection = GetConnection();
MySqlConnection ResumeMilitaryBulletConnection = GetConnection();
MySqlConnection ResumeEducationConnection = GetConnection();
MySqlConnection ResumeSkillConnection = GetConnection();
MySqlConnection ResumeLanguageConnection = GetConnection();
MySqlConnection ResumeCertificationConnection = GetConnection();
MySqlConnection ResumeProjectConnection = GetConnection();
// Open the connections
Task resumeopen = resumeConnection.OpenAsync();
Task resumeexperienceopen = ResumeExperienceConnection.OpenAsync();
Task resumeexperiencebulletopen = ResumeExperienceBulletConnection.OpenAsync();
Task resumemilitaryopen = ResumeMilitaryConnection.OpenAsync();
Task resumemilitarybulletopen = ResumeMilitaryBulletConnection.OpenAsync();
Task resumeeducationopen = ResumeEducationConnection.OpenAsync();
Task resumeskillopen = ResumeSkillConnection.OpenAsync();
Task resumelanguageopen = ResumeLanguageConnection.OpenAsync();
Task resumecertifcationopen = ResumeCertificationConnection.OpenAsync();
Task resumeprojectopen = ResumeProjectConnection.OpenAsync();
// Wait for all the connections to open
await Task.WhenAll(resumeopen, resumeexperienceopen, resumeexperiencebulletopen, resumemilitaryopen, resumemilitarybulletopen,
resumeeducationopen, resumeskillopen, resumelanguageopen, resumecertifcationopen, resumeprojectopen);
// Get all the experience bullets and run all the updates
List<ResumeExperienceBullet> bullets = new List<ResumeExperienceBullet>();
foreach (ResumeExperience cur in resume.Experience) {
foreach (ResumeExperienceBullet bullet in cur.ExperienceBullets) {
bullets.Add(bullet);
}
}
Task ResumeExperienceBulletTask = SetResumeExperienceBullets(ResumeExperienceBulletConnection, bullets.ToArray());
Task ResumeTask = SetResume(resumeConnection, resume);
Task ResumeExperienceTask = SetResumeExperience(ResumeExperienceConnection, resume.Experience);
Task ResumeMilitaryTask = SetResumeMilitary(ResumeMilitaryConnection, resume.Millitary);
Task ResumeMilitaryBulletTask = SetResumeMilitaryBullets(ResumeMilitaryBulletConnection, resume.Millitary.MillitaryBullets);
Task ResumeEducationTask = SetResumeEducation(ResumeEducationConnection, resume.Educations);
Task ResumeSkllTask = SetResumeSkills(ResumeSkillConnection, resume.Skills);
Task ResumeLanguageTask = SetResumeLanguages(ResumeLanguageConnection, resume.Languages);
Task ResumeCertTask = SetResumeCertification(ResumeCertificationConnection, resume.Certification);
Task ResumeProjectTask = SetResumeProjects(ResumeProjectConnection, resume.Projects);
// Allow update to finish before closing process
await Task.WhenAll(ResumeTask, ResumeExperienceTask, ResumeExperienceBulletTask, ResumeMilitaryTask, ResumeMilitaryBulletTask,
ResumeEducationTask, ResumeSkllTask, ResumeLanguageTask, ResumeCertTask, ResumeProjectTask);
}
public async Task DeleteResume( int ResumeID ) {
using( MySqlConnection connection = GetConnection() ) {
MySqlCommand cmd;
connection.Open();
string command = @"
DELETE FROM Resume WHERE ID = @ID;
";
cmd = new MySqlCommand( command, connection );
cmd.Parameters.AddWithValue("@ID", ResumeID);
await cmd.ExecuteNonQueryAsync();
}
}
}
}
@@ -0,0 +1,244 @@
using BoredCareers.Entities;
using System.Data;
using System.Data.Common;
namespace BoredCareers.Services.DatabaseService {
public partial class DatabaseService {
public async Task<Resume?> GetResume(DbDataReader reader) {
while (await reader.ReadAsync()) {
if (reader == null) { break; }
int _id = reader.GetInt32("ID");
int _accountid = reader.GetInt32("AccountID");
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,
Name = _name,
Field = _field,
Email = _email,
PhoneNumber = _phonenumber,
PostalCode = _postalcode,
Country = _country,
StateOrRegion = _state,
City = _city,
IsActive = _isactive
};
}
return null;
}
public async Task<ResumeExperienceBullet[]> GetResumeExperienceBullets(DbDataReader reader) {
List<ResumeExperienceBullet> experienceBullets = new List<ResumeExperienceBullet>();
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<ResumeExperience[]> GetResumeExperience(DbDataReader reader) {
List<ResumeExperience> experience = new List<ResumeExperience>();
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,
});
}
return experience.ToArray();
}
public async Task<ResumeMilitaryBullet[]> GetResumeMilitaryBullets(DbDataReader reader) {
List<ResumeMilitaryBullet> militaryBullets = new List<ResumeMilitaryBullet>();
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
});
}
return militaryBullets.ToArray();
}
public async Task<ResumeMilitary?> GetResumeMilitary(DbDataReader reader) {
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,
};
}
return military;
}
public async Task<ResumeEducation[]> GetResumeEducation(DbDataReader reader) {
List<ResumeEducation>? education = new List<ResumeEducation>();
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
});
}
return education.ToArray();
}
public async Task<ResumeSkill[]> GetResumeSkills(DbDataReader reader) {
List<ResumeSkill> skills = new List<ResumeSkill>();
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
} );
}
return skills.ToArray();
}
public async Task<ResumeLanguage[]> GetResumeLanguages(DbDataReader reader) {
List<ResumeLanguage>? languages = new List<ResumeLanguage>();
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
} );
}
return languages.ToArray();
}
public async Task<ResumeCertification[]> GetResumeCertification(DbDataReader reader) {
List<ResumeCertification> certs = new List<ResumeCertification>();
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
} );
}
return certs.ToArray();
}
public async Task<ResumeProject[]> GetResumeProjects(DbDataReader reader) {
List<ResumeProject>? projects = new List<ResumeProject>();
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
} );
}
return projects.ToArray();
}
}
}
@@ -0,0 +1,287 @@
using BoredCareers.Entities;
using MySql.Data.MySqlClient;
namespace BoredCareers.Services.DatabaseService {
public partial class DatabaseService {
public async Task SetResume(MySqlConnection connection, Resume resume) {
string command = @"
INSERT INTO Resume
(ID,AccountID,Name,Field,Email,PhoneNumber,PostalCode,Country,StateOrRegion,City,IsActive)
VALUES
(@ID,@AccountID,@Name,@Field,@Email,@PhoneNumber,@PostalCode,@Country,@StateOrRegion,@City,@IsActive);
ON DUPLICATE KEY UPDATE
AccountID = @AccountID,
Name = @Name,
Field = @Field,
Email = @Email,
PhoneNumber = @PhoneNumber,
PostalCode = @PostalCode,
Country = @Country,
StateOrRegion = @StateOrRegion,
City = @City,
IsActive = @IsActive;
";
MySqlCommand cmd = new MySqlCommand(command, connection);
cmd.Parameters.AddWithValue("@ID", resume.ID);
cmd.Parameters.AddWithValue("@AccountID", resume.AccountID);
cmd.Parameters.AddWithValue("@Name", resume.Name);
cmd.Parameters.AddWithValue("@Field", resume.Field);
cmd.Parameters.AddWithValue("@Email", resume.Email);
cmd.Parameters.AddWithValue("@PhoneNumber", resume.PhoneNumber);
cmd.Parameters.AddWithValue("@PostalCode", resume.PostalCode);
cmd.Parameters.AddWithValue("@Country", resume.Country);
cmd.Parameters.AddWithValue("@StateOrRegion", resume.StateOrRegion);
cmd.Parameters.AddWithValue("@City", resume.City);
cmd.Parameters.AddWithValue("@IsActive", resume.IsActive);
await cmd.ExecuteNonQueryAsync();
}
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;
";
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);
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;
";
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());
await cmd.ExecuteNonQueryAsync();
}
}
public async Task SetResumeMilitaryBullets(MySqlConnection connection, ResumeMilitaryBullet[] bullets) {
foreach (ResumeMilitaryBullet cur in bullets) {
string command = @"
INSERT INTO Resume
(ID,ResumeID,ResumeMilitaryID,Achievement)
VALUES
(@ID,@ResumeID,@ResumeMilitaryID,@Achievement);
ON DUPLICATE KEY UPDATE
ResumeID = @ResumeID,
ResumeMilitaryID = @ResumeMilitaryID,
Achievement = @Achievement,
Description = @Description;
";
MySqlCommand cmd = new MySqlCommand(command, connection);
cmd.Parameters.AddWithValue("@ID", cur.ID);
cmd.Parameters.AddWithValue("@ResumeID", cur.ResumeID);
cmd.Parameters.AddWithValue("@ResumeMilitaryID", cur.ResumeMilitaryID);
cmd.Parameters.AddWithValue("@Achievement", cur.Achievement);
cmd.Parameters.AddWithValue("@Description", cur.Description);
await cmd.ExecuteNonQueryAsync();
}
}
public async Task SetResumeMilitary(MySqlConnection connection, ResumeMilitary military) {
string command = @"
INSERT INTO Resume
(ID,ResumeID,Country,Rank,DateStarted,StillServing,DateEnded)
VALUES
(@ID,@ResumeID,@Country,@Rank,@DateStarted,@StillServing,@DateEnded);
ON DUPLICATE KEY UPDATE
ResumeID = @ResumeID,
Country = @Country,
Rank = @Rank,
DateStarted = @DateStarted,
StillServing = @StillServing,
DateEnded = @DateEnded;
";
MySqlCommand cmd = new MySqlCommand(command, connection);
cmd.Parameters.AddWithValue("@ID", military.ID);
cmd.Parameters.AddWithValue("@ResumeID", military.ResumeID);
cmd.Parameters.AddWithValue("@Country", military.Country);
cmd.Parameters.AddWithValue("@Rank", military.Rank);
cmd.Parameters.AddWithValue("@DateStarted", military.DateStarted.ToUniversalTime());
cmd.Parameters.AddWithValue("@StillServing", military.StillServing);
cmd.Parameters.AddWithValue("@DateEnded", military.DateEnded.ToUniversalTime());
await cmd.ExecuteNonQueryAsync();
}
public async Task SetResumeEducation(MySqlConnection connection, ResumeEducation[] educations) {
foreach (ResumeEducation cur in educations) {
string command = @"
INSERT INTO Resume
(ID,ResumeID,DegreeType,DegreeField,School,PostalCode,Country,StateOrRegion,City,DateStarted,StillStudying,DateEnded)
VALUES
(@ID,@ResumeID,@DegreeType,@DegreeField,@School,@PostalCode,@Country,@StateOrRegion,@City,@DateStarted,@StillStudying,@DateEnded);
ON DUPLICATE KEY UPDATE
ResumeID = @ResumeID,
DegreeType = @DegreeType,
DegreeField = @DegreeField,
School = @School,
PostalCode = @PostalCode,
Country = @Country,
StateOrRegion = @StateOrRegion,
City = @City,
DateStarted = @DateStarted,
StillStudying = @StillStudying,
DateEnded = @DateEnded;
";
MySqlCommand cmd = new MySqlCommand(command, connection);
cmd.Parameters.AddWithValue("@ID", cur.ID);
cmd.Parameters.AddWithValue("@ResumeID", cur.ResumeID);
cmd.Parameters.AddWithValue("@DegreeType", cur.DegreeType);
cmd.Parameters.AddWithValue("@DegreeField", cur.DegreeField);
cmd.Parameters.AddWithValue("@School", cur.School);
cmd.Parameters.AddWithValue("@PostalCode", cur.PostalCode);
cmd.Parameters.AddWithValue("@Country", cur.Country);
cmd.Parameters.AddWithValue("@StateOrRegion", cur.StateOrRegion);
cmd.Parameters.AddWithValue("@City", cur.City);
cmd.Parameters.AddWithValue("@DateStarted", cur.DateStarted.ToUniversalTime());
cmd.Parameters.AddWithValue("@StillStudying", cur.StillStudying);
cmd.Parameters.AddWithValue("@DateEnded", cur.DateEnded.ToUniversalTime());
await cmd.ExecuteNonQueryAsync();
}
}
public async Task SetResumeSkills(MySqlConnection connection, ResumeSkill[] skills) {
foreach (ResumeSkill cur in skills) {
string command = @"
INSERT INTO Resume
(ID,ResumeID,Name,Description)
VALUES
(@ID,@ResumeID,@Name,@Description);
ON DUPLICATE KEY UPDATE
ResumeID = @ResumeID,
Name = @Name,
Description = @Description;
";
MySqlCommand cmd = new MySqlCommand(command, connection);
cmd.Parameters.AddWithValue("@ID", cur.ID);
cmd.Parameters.AddWithValue("@ResumeID", cur.ResumeID);
cmd.Parameters.AddWithValue("@Name", cur.Name);
cmd.Parameters.AddWithValue("@Description", cur.Description);
await cmd.ExecuteNonQueryAsync();
}
}
public async Task SetResumeLanguages(MySqlConnection connection, ResumeLanguage[] languages) {
foreach (ResumeLanguage cur in languages) {
string command = @"
INSERT INTO Resume
(ID,ResumeID,Language,Proficiency)
VALUES
(@ID,@ResumeID,@Language,@Proficiency);
ON DUPLICATE KEY UPDATE
ResumeID = @ResumeID,
Language = @Language,
Proficiency = @Proficiency;
";
MySqlCommand cmd = new MySqlCommand(command, connection);
cmd.Parameters.AddWithValue("@ID", cur.ID);
cmd.Parameters.AddWithValue("@ResumeID", cur.ResumeID);
cmd.Parameters.AddWithValue("@Language", cur.Language);
cmd.Parameters.AddWithValue("@Proficiency", cur.Proficiency);
await cmd.ExecuteNonQueryAsync();
}
}
public async Task SetResumeCertification(MySqlConnection connection, ResumeCertification[] certifications) {
foreach (ResumeCertification cur in certifications) {
string command = @"
INSERT INTO Resume
(ID,ResumeID,Name,VerificationURL,Description)
VALUES
(@ID,@ResumeID,@Name,@VerificationURL,@Description);
ON DUPLICATE KEY UPDATE
ResumeID = @ResumeID,
Name = @DegreeNameType,
VerificationURL = @VerificationURL,
Description = @Description;
";
MySqlCommand cmd = new MySqlCommand(command, connection);
cmd.Parameters.AddWithValue("@ID", cur.ID);
cmd.Parameters.AddWithValue("@ResumeID", cur.ResumeID);
cmd.Parameters.AddWithValue("@Name", cur.Name);
cmd.Parameters.AddWithValue("@VerificationURL", cur.VerificationURL);
cmd.Parameters.AddWithValue("@Description", cur.Description);
await cmd.ExecuteNonQueryAsync();
}
}
public async Task SetResumeProjects(MySqlConnection connection, ResumeProject[] projects) {
foreach (ResumeProject cur in projects) {
string command = @"
INSERT INTO Resume
(ID,ResumeID,Name,URL,Description)
VALUES
(@ID,@ResumeID,@Name,@URL,@Description);
ON DUPLICATE KEY UPDATE
ResumeID = @ResumeID,
Name = @Name,
URL = @URL,
Description = @Description;
";
MySqlCommand cmd = new MySqlCommand(command, connection);
cmd.Parameters.AddWithValue("@ID", cur.ID);
cmd.Parameters.AddWithValue("@ResumeID", cur.ResumeID);
cmd.Parameters.AddWithValue("@Name", cur.Name);
cmd.Parameters.AddWithValue("@URL", cur.URL);
cmd.Parameters.AddWithValue("@Description", cur.Description);
await cmd.ExecuteNonQueryAsync();
}
}
}
}