301 lines
12 KiB
PHP
301 lines
12 KiB
PHP
<?php
|
|
|
|
use Enums\SubmissionStatus;
|
|
|
|
if (!LOGGED_IN) {
|
|
$title = "Log In";
|
|
$description = "Log in to enter a work into this vote.";
|
|
http_response_code(401);
|
|
}
|
|
|
|
if (LOGGED_IN && isset($_GET["game"])) {
|
|
$sql = "SELECT id FROM submissions
|
|
WHERE game_id = :game_id AND member_id = :member_id";
|
|
$stmt = $db["data"]->prepare($sql);
|
|
$stmt->execute([
|
|
"game_id" => $_GET["game"],
|
|
"member_id" => $_SESSION["account"]->id,
|
|
]);
|
|
$HAS_SUBMISSION = $stmt->fetch(PDO::FETCH_COLUMN) !== false;
|
|
|
|
$sql = "SELECT transaction_id FROM submissions
|
|
WHERE game_id = :game_id AND member_id = :member_id";
|
|
$stmt = $db["data"]->prepare($sql);
|
|
$stmt->execute([
|
|
"game_id" => $_GET["game"],
|
|
"member_id" => $_SESSION["account"]->id,
|
|
]);
|
|
$IS_PAID = $stmt->fetch(PDO::FETCH_COLUMN) !== NULL;
|
|
|
|
if ($HAS_SUBMISSION && $IS_PAID) {
|
|
http_response_code(303);
|
|
header("Location: /games/" . $_GET["game"] . "/update");
|
|
die();
|
|
}
|
|
|
|
$sql = "SELECT id, name, status_id FROM games
|
|
WHERE id = :id";
|
|
$stmt = $db["data"]->prepare($sql);
|
|
$stmt->execute([
|
|
"id" => $_GET["game"],
|
|
]);
|
|
$game = $stmt->fetch(PDO::FETCH_OBJ);
|
|
|
|
$title = "Submit: {$game->name}";
|
|
$description = "Enter a work into the " . $game->name . " vote.";
|
|
}
|
|
|
|
if ($_SERVER["REQUEST_METHOD"] === "POST"):
|
|
$stmt = $db["data"]->prepare("SELECT id FROM games WHERE id = :id");
|
|
$stmt->execute([
|
|
"id" => $_GET["game"],
|
|
]);
|
|
|
|
$game_id = $stmt->fetch(PDO::FETCH_COLUMN) ?? false;
|
|
$errors = [];
|
|
|
|
$RULES_FOLLOWED =
|
|
isset($_POST["agree-toc"]) &&
|
|
$_POST["agree-toc"] === "1" &&
|
|
(isset($_POST["agree-guidelines"]) &&
|
|
$_POST["agree-guidelines"] === "1");
|
|
|
|
if (!$RULES_FOLLOWED) {
|
|
http_response_code(400);
|
|
$errors["agreements"] =
|
|
"Please accept the Terms & Conditions and the Submission Guidelines.";
|
|
}
|
|
|
|
if ($_FILES["manuscript"]["size"] === 0) {
|
|
http_response_code(400);
|
|
$errors["filesize"] = "A file upload is required.";
|
|
} elseif ($_FILES["manuscript"]["size"] > UPLOAD_MAX_FILESIZE) {
|
|
http_response_code(400);
|
|
$errors["filesize"] = "Your document is too large.";
|
|
} else {
|
|
$finfo = finfo_open(FILEINFO_MIME_TYPE);
|
|
$mime_type = finfo_file($finfo, $_FILES["manuscript"]["tmp_name"]);
|
|
finfo_close($finfo);
|
|
|
|
$PROPER_MIMETYPE = $mime_type === "application/pdf";
|
|
}
|
|
|
|
if (isset($PROPER_MIMETYPE) && !$PROPER_MIMETYPE) {
|
|
http_response_code(400);
|
|
$errors["mimetype"] = "Only PDF submissions are allowed.";
|
|
}
|
|
|
|
if (!isset($_POST["title"]) || !trim($_POST["title"])) {
|
|
http_response_code(400);
|
|
$errors["title"] = "Please enter a title.";
|
|
}
|
|
|
|
if (!isset($_SESSION["account"]) && !isset($_SESSION["account"]->id)) {
|
|
http_response_code(500);
|
|
$errors["account"] =
|
|
"We can't upload a document without knowing which account it belongs to.";
|
|
}
|
|
|
|
if (!$game_id) {
|
|
http_response_code(400);
|
|
$errors["game"] = "The chosen game doesn't exist.";
|
|
}
|
|
|
|
if (count($errors) > 0) {
|
|
if (!isset($errors["filesize"]) && !isset($errors["mimetype"])) {
|
|
$errors["upload"] =
|
|
"Fix all other errors and choose your file again.";
|
|
}
|
|
} else {
|
|
$new_basename =
|
|
md5(microtime() . $game_id . $_SESSION["account"]->id) . ".pdf";
|
|
$lookup_hash = md5(
|
|
$_SESSION["account"]->id . $game_id . microtime() . "salt"
|
|
);
|
|
|
|
$file_destination = sprintf(
|
|
"%s/%s/%s",
|
|
DIRECTORY_DOCS,
|
|
$game_id,
|
|
$new_basename
|
|
);
|
|
|
|
try {
|
|
$file_moved = move_uploaded_file(
|
|
$_FILES["manuscript"]["tmp_name"],
|
|
$file_destination
|
|
);
|
|
|
|
if ($file_moved) {
|
|
$show_doc = isset($_POST["public-doc"]) ? 1 : 0;
|
|
$show_name = isset($_POST["public-name"]) ? 1 : 0;
|
|
|
|
$stmt = $db["data"]
|
|
->prepare("INSERT INTO submissions (member_id, game_id, title, basename, hash, doc_is_public, name_is_public, transaction_id, status, is_freeroll, created_at)
|
|
VALUES (:member_id, :game_id, :title, :basename, :hash, :doc_is_public, :name_is_public, :transaction_id, :status, :is_freeroll, :created_at)");
|
|
|
|
$stmt->execute([
|
|
"member_id" => $_SESSION["account"]->id,
|
|
"game_id" => $_GET["game"],
|
|
"title" => $_POST["title"],
|
|
"basename" => "$new_basename",
|
|
"hash" => $lookup_hash,
|
|
"doc_is_public" => $show_doc,
|
|
"name_is_public" => $show_name,
|
|
"transaction_id" => NULL,
|
|
"status" => SubmissionStatus::Pending->value,
|
|
"is_freeroll" => 0,
|
|
"created_at" => date("Y-m-d\TH:i:s\Z"),
|
|
]);
|
|
|
|
http_response_code(303);
|
|
header("Location: /games/" . $_GET["game"] . "/submit");
|
|
}
|
|
} catch (Exception $e) {
|
|
http_response_code(500);
|
|
unlink($file_destination);
|
|
|
|
$errors["upload"] =
|
|
"There was an error adding your submission to our database. Please try again.";
|
|
}
|
|
}
|
|
endif;
|
|
|
|
include "partials/head.php";
|
|
?>
|
|
<body>
|
|
<?php include "partials/header.php"; ?>
|
|
<main id="main" class="flow">
|
|
<header>
|
|
<h1><?= $title ?></h1>
|
|
</header>
|
|
<?php if (!LOGGED_IN) {
|
|
include "partials/login-form.php";
|
|
} else if (!$HAS_SUBMISSION) {
|
|
if (
|
|
http_response_code() === 400 ||
|
|
http_response_code() === 500
|
|
) { ?>
|
|
<aside class='alert'>
|
|
<p>We found <?= count(
|
|
$errors
|
|
) ?> error(s) with your submission. Please correct the errors provided by each field.</p>
|
|
</aside>
|
|
<?php } ?>
|
|
<form action="<?= $_SERVER[
|
|
"REQUEST_URI"
|
|
] ?>" method="post" enctype="multipart/form-data" class="flow">
|
|
<p><b>After submitting you work, you will be redirected to a payment page. Payment is required for inclusion in the contest.</b></p>
|
|
<?php if (
|
|
isset($errors) &&
|
|
isset($errors["account"])
|
|
) { ?><p><mark><?= $errors[
|
|
"account"
|
|
] ?></mark></p><?php } ?>
|
|
<?php if (
|
|
isset($errors) &&
|
|
isset($errors["game"])
|
|
) { ?><p><mark><?= $errors[
|
|
"game"
|
|
] ?></mark></p><?php } ?>
|
|
<fieldset class="flow">
|
|
<legend>Manuscript details</legend>
|
|
<label>
|
|
<span>Title of Work</span>
|
|
<?php if (
|
|
isset($errors) &&
|
|
isset($errors["title"])
|
|
) { ?><span><mark><?= $errors[
|
|
"title"
|
|
] ?></mark></span><?php } ?>
|
|
<input type="text" name="title" value='<?= $_POST[
|
|
"title"
|
|
] ?? "" ?>'/>
|
|
</label>
|
|
<label>
|
|
<span>Manuscript PDF <small>(6MB limit)</small></span>
|
|
<?php if (
|
|
isset($errors) &&
|
|
isset($errors["upload"])
|
|
) { ?><span><mark><?= $errors[
|
|
"upload"
|
|
] ?></mark></span><?php } ?>
|
|
<?php if (
|
|
isset($errors) &&
|
|
isset($errors["filesize"])
|
|
) { ?><span><mark><?= $errors[
|
|
"filesize"
|
|
] ?></mark></span><?php } ?>
|
|
<?php if (
|
|
isset($errors) &&
|
|
isset($errors["mimetype"])
|
|
) { ?><span><mark><?= $errors[
|
|
"mimetype"
|
|
] ?></mark></span><?php } ?>
|
|
<input type="file" name="manuscript" accept="application/pdf"/>
|
|
</label>
|
|
<div>
|
|
<?php if (
|
|
isset($errors) &&
|
|
isset($errors["agreements"])
|
|
) { ?><span><mark><?= $errors[
|
|
"agreements"
|
|
] ?></mark></span><?php } ?>
|
|
<label>
|
|
<input type="checkbox" name="agree-toc" value="1" <?= isset(
|
|
$_POST["agree-toc"]
|
|
)
|
|
? "checked"
|
|
: "" ?>/>
|
|
<span>I agree to <i>Sixfold</i>'s <a href="https://sixfold.org/terms-and-conditions" target="_blank">terms and conditions</a></span>
|
|
</label>
|
|
<label>
|
|
<input type="checkbox" name="agree-guidelines" value="1" <?= isset(
|
|
$_POST["agree-guidelines"]
|
|
)
|
|
? "checked"
|
|
: "" ?>/>
|
|
<span>I confirm that the submitted manuscript meets the <strong></strong><a href="https://sixfold.org/how-it-works/submission-guidelines" target="_blank">submission guidelines</a></span>
|
|
</label>
|
|
</div>
|
|
</fieldset>
|
|
<fieldset>
|
|
<legend>Privacy settings</legend>
|
|
<label>
|
|
<input type="checkbox" name="public-name" value="1" <?= isset(
|
|
$_POST["public-name"]
|
|
)
|
|
? "checked"
|
|
: "" ?>/>
|
|
<span>Display my name in the public results</span>
|
|
</label>
|
|
<label>
|
|
<input type="checkbox" name="public-doc" value="1" <?= isset(
|
|
$_POST["public-doc"]
|
|
)
|
|
? "checked"
|
|
: "" ?>/>
|
|
<span>Display my document in the public results</span>
|
|
</label>
|
|
</fieldset>
|
|
<button type="submit">Submit work</button>
|
|
</form>
|
|
<?php
|
|
} else if (!$IS_PAID) { ?>
|
|
<form class="flow">
|
|
<aside class="alert">
|
|
<p>Your manuscript submission has been processed.</p>
|
|
</aside>
|
|
<p><b>Payment is required for participation.</b></p>
|
|
<input type="hidden" id="game-name" value="<?= $game->name ?>" />
|
|
<input type="hidden" id="game-id" value="<?= $game->id ?>" />
|
|
<p><mark id='paypal-errors' aria-live='polite'></mark></p>
|
|
<div id="paypal-button-container"></div>
|
|
<script
|
|
src="https://www.paypal.com/sdk/js?merchant-id=LF2R8M5TKKHRL&client-id=<?= PAYPAL_CLIENT_ID ?>¤cy=USD&components=buttons&enable-funding=card,venmo&disable-funding=paylater"
|
|
data-sdk-integration-source="developer-studio"></script>
|
|
<script src="/assets/js/paypal.js?ver=<?= time() ?>"></script>
|
|
</form>
|
|
<?php } ?>
|
|
</main>
|
|
<?php include "partials/footer.php"; ?>
|