Spec marked

Handler for the creation of a new request
This commit is contained in:
Tina_Azure
2023-04-10 19:28:40 +02:00
parent 1f5372461c
commit 63b5805658
2 changed files with 59 additions and 31 deletions

View File

@ -107,7 +107,7 @@ See the freelancer section under concepts for more information of what this shou
Accessing this page will provide the customer with a rendered HTML document of a freelancer's job template. This rendering will take data that the freelancer provides for the job, ideally stored in the database, and fills it in for delivery to the customer. The job template should use a html template that the system administrator provides for filling in.
### "/customer/$freelancer/template/$templateName/request"
+++ "/customer/$freelancer/template/$templateName/request"
request data partially provided by the template, gets filled out by the customer on this page.

View File

@ -9,6 +9,9 @@
using namespace std;
int main() {
Utilities::config configuration;
configuration.readConfigFile();
crow::SimpleApp app;
// CROW_ROUTE(app, "/test.json")
@ -145,21 +148,24 @@ int main() {
return page.render(ctx);
});
/*
* executes the creation of a new request.
*/
CROW_ROUTE(app, "/customer/<string>/template/<string>/request/fulfilment").methods("POST"_method)
([databaseURI, configuration](const crow::request& postRequest, string freelancerName, string templateName ) {
pqxx::connection databaseConnection(databaseURI);
string templateHTML = "customer_Freelancer_Template_Request_Fulfilment_ERROR.html";
Database::requestsItem newRequest;
crow::mustache::context ctx;
ctx["freelancername"] = freelancerName;
ctx["templatename"] = templateName;
string postRequestBody = postRequest.body.c_str();
Utilities::decodeString(postRequestBody);
vector<string> splitPostRequestBody = Utilities::splitStringIntoVector(postRequestBody, '&');
bool requestFillCompletion = false;
for (string item : splitPostRequestBody) {
vector<string> splitItem = Utilities::splitStringIntoVector(item, '=');
if (splitItem.at(0) == "customername")
@ -173,33 +179,55 @@ int main() {
if (splitItem.at(0) == "templateID")
newRequest.templateID = stoi(splitItem.at(1));
}
if (newRequest.customerName != "" && (newRequest.customerEmailAddress != "" || newRequest.customerContactDetails != "") && newRequest.requestDescription != "" )
requestFillCompletion = true;
ctx["templateid"] = newRequest.templateID;
pqxx::connection databaseConnection(databaseURI);
pqxx::result resultTemplate = Database::executePreparedStatement_SELECT_TEMPLATE_FLAT(databaseConnection, newRequest.templateID);
if (resultTemplate.size() > 0 && requestFillCompletion) {
for (int i = 0; i < resultTemplate.columns(); ++i) {
//freelancerid
newRequest.freelancerID = stoi(resultTemplate.at(0).at(0).c_str());
//currencypreference
newRequest.currencyPreference = resultTemplate.at(0).at(1).c_str();
//priceupfront
newRequest.priceUpFront = resultTemplate.at(0).at(2).c_str();
//priceondeliver
newRequest.priceOnDeliver = resultTemplate.at(0).at(3).c_str();
}
for (int i = 0; i < resultTemplate.columns(); ++i) {
//freelancerid
newRequest.freelancerID = stoi(resultTemplate.at(0).at(0).c_str());
//currencypreference
newRequest.currencyPreference = resultTemplate.at(0).at(1).c_str();
//priceupfront
newRequest.priceUpFront = resultTemplate.at(0).at(2).c_str();
//priceondeliver
newRequest.priceOnDeliver = resultTemplate.at(0).at(3).c_str();
pqxx::result resultCommissionState = Database::executePreparedStatement_SELECT_FREELANCER_COMMISSION_STATE(databaseConnection, newRequest.freelancerID);
//the commissionstate
if (resultCommissionState.size() == 0 || stoi(resultTemplate.at(0).at(0).c_str()) == 1) {
ctx["ERROR_COMMISSIONS_CLOSED"] = true;
}
else {
int resultInsertOperation = Database::executePreparedStatement_INSERT_ITEM_IN_REQUESTS(databaseConnection, newRequest);
if (resultInsertOperation == 0) {
templateHTML = "customer_Freelancer_Template_Request_Fulfilment.html";
pqxx::result resultEmailAddress = Database::executePreparedStatement_SELECT_FREELANCER_EMAIL(databaseConnection, newRequest.freelancerID);
if (resultEmailAddress.size() > 0)
Utilities::sendEmail(configuration, resultEmailAddress.at(0).at(0).c_str(), "NEW REQUEST", newRequest.toJSONString());
}
else {
ctx["ERROR_UNABLE_TO_CREATE_REQUEST"] = true;
}
}
}
newRequest.outputItem();
else {
if (requestFillCompletion)
ctx["ERROR_TEMPLATE_NOT_FOUND"] = true;
else
ctx["REQUEST_NOT_FILLED"] = true;
Utilities::sendEmail(configuration, "testfaewfaw@tempr.email", "NEW REQUEST", "NEW REQUEST");
string templateHTML = "customer_Freelancer_Template_Request_Fulfilment.html";
}
auto page = crow::mustache::load(templateHTML);
return page.render();
return page.render(ctx);
});
@ -221,7 +249,7 @@ int main() {
CROW_ROUTE(app, "/getEntry/<int>")
/*CROW_ROUTE(app, "/getEntry/<int>")
([databaseURI](int entry) {
pqxx::connection databaseConnection(databaseURI);
pqxx::result result = Database::executePreparedStatement_SELECT_ITEM_BY_ID(databaseConnection, entry);
@ -269,11 +297,11 @@ int main() {
if (!jsonBody)
return crow::response(crow::status::BAD_REQUEST);
/*
* Example CURL to insert into DB:
* Price must be delivered as a string to avoid unnecessary conversion to double which would lead to the addition to a database of the value 0.359999999999999999999999999 instead of 0.36.
* curl -H "Content-Type: application/json" -H "Accept: application/json" -d '{"customerEmailAddress":"2@testmail.com","freelancer":"nick","templateName":"coding","currencyPreference":"XMR","priceUpFront":"0.36","priceOnDeliver":"0.36","requestDescription":"This is a test","accepted":false,"upFrontInvoiceID":"12424242424","onDeliverInvoiceID":"329532532532","upFrontPaid":false,"onDeliverPaid":false}' http://0.0.0.0:18080/newRequest
*/
Database::requestsItem item;
item.insertJsonIntoItem(jsonBody);
@ -282,7 +310,7 @@ int main() {
return crow::response(200);
});
*/
//set the port, set the app to run on multiple threads, and run the app
app.port(18080).multithreaded().run();