add file metadata to database
This commit is contained in:
@ -694,6 +694,32 @@ namespace Database {
|
||||
work.commit();
|
||||
return result;
|
||||
}
|
||||
/*
|
||||
* Executes the prepared statement INSERT_FREELANCER_FILE_SUBMISSION
|
||||
* Takes an open pqxx::connection and the freelancer email, the file name, the full path and the filesize in byte
|
||||
* returns errorLevel
|
||||
* 0 = no error
|
||||
* 1 = query error
|
||||
* 2 = critical error
|
||||
*/
|
||||
int executePreparedStatement_INSERT_FREELANCER_FILE_SUBMISSION(pqxx::connection &connection, const std::string& email, const std::string& fileName, const std::string& fullPath, const std::size_t filesize) {
|
||||
try {
|
||||
pqxx::work work(connection);
|
||||
work.exec_prepared(PREPARED_STATEMENT_INSERT_FREELANCER_FILE_SUBMISSION, email, fileName, fullPath, filesize);
|
||||
work.commit();
|
||||
}
|
||||
catch (pqxx::sql_error const &e) {
|
||||
std::cerr
|
||||
<< "Database error: " << e.what() << std::endl
|
||||
<< "Query was: " << e.query() << std::endl;
|
||||
return 1;
|
||||
}
|
||||
catch (std::exception const &e) {
|
||||
std::cerr << e.what() << std::endl;
|
||||
return 2;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Prepares a statement based on ID
|
||||
|
@ -264,7 +264,15 @@ namespace DatabaseStatementConstCollection {
|
||||
* Name and Statement for prepared statement to purge expired file submissions from the database
|
||||
*/
|
||||
const static std::string PREPARED_STATEMENT_PRUGE_FREELANCER_FILE_SUBMISSION = "purgeFreelancerFileSubmissions";
|
||||
const static std::string SQL_STATEMENT_PRUGE_FREELANCER_FILE_SUBMISSION_PATH = "delete from freelancersubmissions where (current_timestamp - uploaddate) > make_interval(hours => $1)";
|
||||
const static std::string SQL_STATEMENT_PRUGE_FREELANCER_FILE_SUBMISSION = "delete from freelancersubmissions where (current_timestamp - uploaddate) > make_interval(hours => $1)";
|
||||
|
||||
/*
|
||||
* Name and Statement for prepared statement to insert metadata of a submission.
|
||||
* 1=freelancer email, 2=filename, 3=fullpath, 4=filesize in byte
|
||||
*/
|
||||
const static std::string PREPARED_STATEMENT_INSERT_FREELANCER_FILE_SUBMISSION = "insertFreelancerFileSubmission";
|
||||
const static std::string SQL_STATEMENT_INSERT_FREELANCER_FILE_SUBMISSION = "insert into freelancersubmissions values ((select freelancers.id from freelancers where emailaddress = $1), $2, $3, $4, CURRENT_TIMESTAMP);";
|
||||
|
||||
|
||||
/*
|
||||
* IDs of prepared statements
|
||||
@ -311,6 +319,7 @@ namespace DatabaseStatementConstCollection {
|
||||
const static int ID_SELECT_FREELANCER_FILE_SUBMISSION_PATH = 39;
|
||||
const static int ID_DELETE_FREELANCER_FILE_SUBMISSION = 40;
|
||||
const static int ID_PRUGE_FREELANCER_FILE_SUBMISSION = 41;
|
||||
const static int ID_INSERT_FREELANCER_FILE_SUBMISSION = 42;
|
||||
|
||||
|
||||
|
||||
@ -359,7 +368,8 @@ namespace DatabaseStatementConstCollection {
|
||||
{PREPARED_STATEMENT_SELECT_FREELANCER_FILE_SUBMISSION_USED_STORAGE, SQL_STATEMENT_SELECT_FREELANCER_FILE_SUBMISSION_USED_STORAGE},
|
||||
{PREPARED_STATEMENT_SELECT_FREELANCER_FILE_SUBMISSION_PATH, SQL_STATEMENT_SELECT_FREELANCER_FILE_SUBMISSION_PATH},
|
||||
{PREPARED_STATEMENT_DELETE_FREELANCER_FILE_SUBMISSION, SQL_STATEMENT_DELETE_FREELANCER_FILE_SUBMISSION_PATH},
|
||||
{PREPARED_STATEMENT_PRUGE_FREELANCER_FILE_SUBMISSION, SQL_STATEMENT_PRUGE_FREELANCER_FILE_SUBMISSION_PATH}
|
||||
{PREPARED_STATEMENT_PRUGE_FREELANCER_FILE_SUBMISSION, SQL_STATEMENT_PRUGE_FREELANCER_FILE_SUBMISSION},
|
||||
{PREPARED_STATEMENT_INSERT_FREELANCER_FILE_SUBMISSION, SQL_STATEMENT_INSERT_FREELANCER_FILE_SUBMISSION}
|
||||
};
|
||||
/*
|
||||
* Easy access to prepared statement name via int
|
||||
@ -406,7 +416,8 @@ namespace DatabaseStatementConstCollection {
|
||||
{ID_SELECT_FREELANCER_FILE_SUBMISSION_USED_STORAGE, PREPARED_STATEMENT_SELECT_FREELANCER_FILE_SUBMISSION_USED_STORAGE},
|
||||
{ID_SELECT_FREELANCER_FILE_SUBMISSION_PATH, PREPARED_STATEMENT_SELECT_FREELANCER_FILE_SUBMISSION_PATH},
|
||||
{ID_DELETE_FREELANCER_FILE_SUBMISSION, PREPARED_STATEMENT_DELETE_FREELANCER_FILE_SUBMISSION},
|
||||
{ID_PRUGE_FREELANCER_FILE_SUBMISSION, PREPARED_STATEMENT_PRUGE_FREELANCER_FILE_SUBMISSION}
|
||||
{ID_PRUGE_FREELANCER_FILE_SUBMISSION, PREPARED_STATEMENT_PRUGE_FREELANCER_FILE_SUBMISSION},
|
||||
{ID_INSERT_FREELANCER_FILE_SUBMISSION, PREPARED_STATEMENT_INSERT_FREELANCER_FILE_SUBMISSION}
|
||||
};
|
||||
|
||||
/*
|
||||
|
15
src/main.cpp
15
src/main.cpp
@ -1023,7 +1023,8 @@ int main(int argc, char *argv[]) {
|
||||
pqxx::connection databaseConnection(configuration.databaseConnectionString);
|
||||
Database::prepareStatements(databaseConnection, {
|
||||
ID_SELECT_FREELANCER_ID,
|
||||
ID_SELECT_FREELANCER_NAME
|
||||
ID_SELECT_FREELANCER_NAME,
|
||||
ID_INSERT_FREELANCER_FILE_SUBMISSION
|
||||
});
|
||||
|
||||
string freelancerName, freelancerID;
|
||||
@ -1079,7 +1080,7 @@ int main(int argc, char *argv[]) {
|
||||
if (!Utilities::validateFolderPath(outputFolderPath))
|
||||
return crow::response(400, "Unable to write to Freelancer folder");
|
||||
|
||||
const std::string& outputFilename = filename;
|
||||
const std::string& outputFilename = Utilities::generateHashedFileName(filename);
|
||||
const std::string outputFilePath = Utilities::generateSubmissionFilePath(outputFolderPath, outputFilename);
|
||||
|
||||
if (!Utilities::validateFilePath(outputFilePath))
|
||||
@ -1098,6 +1099,16 @@ int main(int argc, char *argv[]) {
|
||||
outputFileStream << postRequest.body[i];
|
||||
}
|
||||
outputFileStream.close();
|
||||
|
||||
size_t filesize = postRequest.body.size() - fileContentStart; //get filesize without metadata
|
||||
|
||||
if (Database::executePreparedStatement_INSERT_FREELANCER_FILE_SUBMISSION(databaseConnection, cookieCtx.get_cookie(COOKIE_FREELANCER_EMAIL), outputFilename, outputFilePath, filesize) != 0)
|
||||
Utilities::errorOut("Error occured on insert of file to database after successful completion of the upload and saving:\n FreelancerEmail: "
|
||||
+ cookieCtx.get_cookie(COOKIE_FREELANCER_EMAIL)
|
||||
+ "\noutputFilename: " + outputFilename
|
||||
+ "\noutputFilePath: " + outputFilePath
|
||||
+ "\nfileSize: " + to_string(filesize));
|
||||
|
||||
return crow::response(200, "Upload was successfull");
|
||||
}
|
||||
else {
|
||||
|
@ -735,11 +735,17 @@ namespace Utilities {
|
||||
return folderPath;
|
||||
}
|
||||
|
||||
std::string generateHashedFileName(const std::string& fileName) {
|
||||
std::string hashedFileName = "[";
|
||||
hashedFileName.append(generateRandomHashValueSHA1Short(5));
|
||||
hashedFileName.append("]");
|
||||
hashedFileName.append(fileName);
|
||||
return hashedFileName;
|
||||
}
|
||||
|
||||
std::string generateSubmissionFilePath(const std::string& folderPath, const std::string& fileName){
|
||||
std::string filePath = folderPath;
|
||||
filePath.append("/[");
|
||||
filePath.append(generateRandomHashValueSHA1Short(5));
|
||||
filePath.append("]");
|
||||
filePath.append("/");
|
||||
filePath.append(fileName);
|
||||
return filePath;
|
||||
}
|
||||
|
@ -7,7 +7,7 @@
|
||||
function upload() {
|
||||
var file = _("FILE_SUBMISSION").files[0];
|
||||
const fileSize = file.size / 1024 / 1024;
|
||||
const maxSize = {{MAXIMUM_STORAGE_IN_MB}} - {{AVAILIBLE_STORAGE_IN_MB}};
|
||||
const maxSize = {{MAXIMUM_STORAGE_IN_MB}} - {{USED_STORAGE_IN_MB}};
|
||||
const maxFileNameLength = {{MAXIMUM_FILE_NAME_SIZE}};
|
||||
console.log(maxSize);
|
||||
console.log(maxFileNameLength);
|
||||
|
Reference in New Issue
Block a user