mirror of
https://github.com/godotengine/godot-asset-library.git
synced 2026-02-25 06:33:01 +03:00
Add editing of previews
🎉!
This commit is contained in:
@@ -5,6 +5,7 @@ SET time_zone = '+00:00';
|
||||
SET foreign_key_checks = 0;
|
||||
SET sql_mode = 'NO_AUTO_VALUE_ON_ZERO';
|
||||
|
||||
DROP TABLE IF EXISTS `as_assets`;
|
||||
CREATE TABLE `as_assets` (
|
||||
`asset_id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`user_id` int(11) NOT NULL DEFAULT '0',
|
||||
@@ -13,19 +14,20 @@ CREATE TABLE `as_assets` (
|
||||
`category_id` int(11) NOT NULL DEFAULT '6',
|
||||
`version` int(11) NOT NULL,
|
||||
`version_string` varchar(20) NOT NULL,
|
||||
`support_level` tinyint(4) NOT NULL,
|
||||
`cost` varchar(25) NOT NULL DEFAULT 'GPLv3',
|
||||
`rating` int(11) NOT NULL DEFAULT '1',
|
||||
`download_hash` varchar(64) NOT NULL,
|
||||
`support_level` tinyint(4) NOT NULL,
|
||||
`download_url` varchar(1024) NOT NULL,
|
||||
`download_hash` text NOT NULL,
|
||||
`browse_url` varchar(1024) NOT NULL,
|
||||
`icon_url` varchar(1024) NOT NULL,
|
||||
`searchable` tinyint(1) NOT NULL DEFAULT '0',
|
||||
`modify_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
`modify_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`asset_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
|
||||
|
||||
|
||||
DROP TABLE IF EXISTS `as_asset_edits`;
|
||||
CREATE TABLE `as_asset_edits` (
|
||||
`edit_id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`asset_id` int(11) NOT NULL,
|
||||
@@ -40,14 +42,31 @@ CREATE TABLE `as_asset_edits` (
|
||||
`icon_url` varchar(1024) DEFAULT NULL,
|
||||
`status` tinyint(4) NOT NULL DEFAULT '0',
|
||||
`reason` text NOT NULL,
|
||||
`submit_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`modify_date` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
`submit_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||
`modify_date` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY (`edit_id`),
|
||||
KEY `asset_id` (`asset_id`),
|
||||
KEY `status` (`status`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
|
||||
DROP TABLE IF EXISTS `as_asset_edit_previews`;
|
||||
CREATE TABLE `as_asset_edit_previews` (
|
||||
`edit_preview_id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`edit_id` int(11) NOT NULL,
|
||||
`preview_id` int(11) NOT NULL,
|
||||
`type` enum('image','video') DEFAULT NULL,
|
||||
`link` varchar(1024) DEFAULT NULL,
|
||||
`thumbnail` varchar(1024) DEFAULT NULL,
|
||||
`operation` tinyint(4) NOT NULL,
|
||||
PRIMARY KEY (`edit_preview_id`),
|
||||
KEY `asset_id` (`edit_id`),
|
||||
KEY `type` (`type`),
|
||||
KEY `preview_id` (`preview_id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
|
||||
|
||||
|
||||
DROP TABLE IF EXISTS `as_asset_previews`;
|
||||
CREATE TABLE `as_asset_previews` (
|
||||
`preview_id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`asset_id` int(11) NOT NULL,
|
||||
@@ -60,6 +79,7 @@ CREATE TABLE `as_asset_previews` (
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=latin1;
|
||||
|
||||
|
||||
DROP TABLE IF EXISTS `as_categories`;
|
||||
CREATE TABLE `as_categories` (
|
||||
`category_id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`category` varchar(25) NOT NULL,
|
||||
@@ -80,6 +100,7 @@ INSERT INTO `as_categories` (`category_id`, `category`, `category_type`) VALUES
|
||||
(9, 'Projects', 1),
|
||||
(10, 'Demos', 1);
|
||||
|
||||
DROP TABLE IF EXISTS `as_users`;
|
||||
CREATE TABLE `as_users` (
|
||||
`user_id` int(11) NOT NULL AUTO_INCREMENT,
|
||||
`username` varchar(100) NOT NULL,
|
||||
@@ -93,4 +114,4 @@ CREATE TABLE `as_users` (
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
|
||||
|
||||
|
||||
-- 2016-06-21 19:14:52
|
||||
-- 2016-07-25 18:15:07
|
||||
|
||||
@@ -16,15 +16,20 @@ return $constants = [
|
||||
'accepted' => 2,
|
||||
'rejected' => 3,
|
||||
]),
|
||||
'edit_preview_operation' => double_map([
|
||||
'insert' => 0,
|
||||
'remove' => 1,
|
||||
'update' => 2,
|
||||
]),
|
||||
'category_type' => double_map([
|
||||
'addon' => 0,
|
||||
'project' => 1,
|
||||
'any' => '%'
|
||||
'any' => '%',
|
||||
]),
|
||||
'support_level' => double_map([
|
||||
'testing' => 0,
|
||||
'community' => 1,
|
||||
'official' => 2
|
||||
'official' => 2,
|
||||
]),
|
||||
'user_type' => double_map([
|
||||
'normal' => 0,
|
||||
@@ -35,5 +40,8 @@ return $constants = [
|
||||
'title', 'description', 'category_id',
|
||||
'version_string', 'cost',
|
||||
'download_url', 'browse_url', 'icon_url',
|
||||
],
|
||||
'asset_edit_preview_fields' => [
|
||||
'type', 'link', 'thumbnail',
|
||||
]
|
||||
];
|
||||
@@ -60,7 +60,7 @@ class Utils
|
||||
{
|
||||
if($currentStatus) return true;
|
||||
|
||||
if(!isset($object[$property]) || !is_string($object[$property])) {
|
||||
if(!isset($object[$property]) || !is_string($object[$property]) || $object[$property] == "") {
|
||||
$response = $response->withJson([
|
||||
'error' => $property . ' is required, and must be a string'
|
||||
], 400);
|
||||
|
||||
@@ -57,6 +57,7 @@ if(isset($frontend) && $frontend) {
|
||||
'GET /asset/{id}' => 'asset',
|
||||
'GET /asset/{id}/edit' => 'edit_asset',
|
||||
'GET /asset/edit/{id}' => 'asset_edit',
|
||||
'GET /asset/edit/{id}/edit' => 'edit_asset_edit',
|
||||
//'/register' => 'registered',
|
||||
'GET /login' => 'login',
|
||||
'GET /register' => 'register',
|
||||
|
||||
@@ -78,12 +78,31 @@ return [
|
||||
version=version+:update_version
|
||||
WHERE asset_id=:asset_id',
|
||||
|
||||
'apply_preview_edit_insert' => 'INSERT INTO `as_asset_previews`
|
||||
SET asset_id=:asset_id, type=:type, link=:link, thumbnail=:thumbnail',
|
||||
'apply_preview_edit_remove' => 'DELETE FROM `as_asset_previews`
|
||||
WHERE preview_id=:preview_id',
|
||||
'apply_preview_edit_update' => 'UPDATE `as_asset_previews`
|
||||
SET type=COALESCE(:type, type), link=COALESCE(:link, link), thumbnail=COALESCE(:thumbnail, thumbnail)
|
||||
WHERE preview_id=:preview_id',
|
||||
|
||||
'set_support_level' => 'UPDATE `as_assets`
|
||||
SET support_level=:support_level
|
||||
WHERE asset_id=:asset_id'
|
||||
],
|
||||
'asset_edit' => [
|
||||
'get_one' => 'SELECT * FROM `as_asset_edits` WHERE edit_id=:edit_id',
|
||||
'get_one' => 'SELECT edit_id, `as_asset_edits`.asset_id, user_id, title, description, category_id, version_string,
|
||||
cost, download_url, browse_url, icon_url, status,
|
||||
edit_preview_id, `as_asset_previews`.preview_id, `as_asset_edit_previews`.type, `as_asset_edit_previews`.link, `as_asset_edit_previews`.thumbnail, `as_asset_edit_previews`.operation,
|
||||
`as_asset_previews`.type AS orig_type, `as_asset_previews`.link AS orig_link, `as_asset_previews`.thumbnail AS orig_thumbnail,
|
||||
unedited_previews.preview_id AS unedited_preview_id, unedited_previews.type AS unedited_type, unedited_previews.link AS unedited_link, unedited_previews.thumbnail AS unedited_thumbnail
|
||||
FROM `as_asset_edits`
|
||||
LEFT JOIN `as_asset_edit_previews` USING (edit_id)
|
||||
LEFT JOIN `as_asset_previews` USING (preview_id)
|
||||
LEFT JOIN `as_asset_previews` AS unedited_previews ON `as_asset_edits`.asset_id = unedited_previews.asset_id
|
||||
WHERE edit_id=:edit_id',
|
||||
|
||||
'get_one_bare' => 'SELECT * FROM `as_asset_edits` WHERE edit_id=:edit_id',
|
||||
'get_one_with_status' => 'SELECT * FROM `as_asset_edits` WHERE edit_id=:edit_id AND status=:status',
|
||||
'get_editable_by_asset_id' => 'SELECT * FROM `as_asset_edits` WHERE asset_id=:asset_id AND status=0',
|
||||
|
||||
@@ -97,6 +116,14 @@ return [
|
||||
download_url=COALESCE(:download_url, download_url), browse_url=COALESCE(:browse_url, browse_url), icon_url=COALESCE(:icon_url, icon_url)
|
||||
WHERE edit_id=:edit_id AND status=0',
|
||||
|
||||
'add_preview' => 'INSERT INTO `as_asset_edit_previews`
|
||||
SET edit_id=:edit_id, preview_id=:preview_id, type=:type, link=:link, thumbnail=:thumbnail, operation=:operation',
|
||||
'update_preview' => 'UPDATE `as_asset_edit_previews`
|
||||
SET type=COALESCE(:type, type), link=COALESCE(:link, link), thumbnail=COALESCE(:thumbnail, thumbnail)
|
||||
WHERE edit_id=:edit_id AND edit_preview_id=:edit_preview_id',
|
||||
'remove_preview' => 'DELETE FROM `as_asset_edit_previews`
|
||||
WHERE edit_id=:edit_id AND edit_preview_id=:edit_preview_id',
|
||||
|
||||
'set_asset_id' => 'UPDATE `as_asset_edits` SET asset_id=:asset_id WHERE edit_id=:edit_id',
|
||||
'set_status_and_reason' => 'UPDATE `as_asset_edits` SET status=:status, reason=:reason WHERE edit_id=:edit_id',
|
||||
],
|
||||
|
||||
@@ -127,7 +127,7 @@ $get_asset = function ($request, $response, $args) {
|
||||
foreach ($row as $column => $value) {
|
||||
if($value!==null) {
|
||||
if($column==='preview_id') {
|
||||
$previews[] = [];
|
||||
$previews[] = ['preview_id' => $value];
|
||||
} elseif($column==="type" || $column==="link" || $column==="thumbnail") {
|
||||
$previews[count($previews) - 1][$column] = $value;
|
||||
} elseif($column==="category_type") {
|
||||
|
||||
@@ -1,6 +1,194 @@
|
||||
<?php
|
||||
// Asset editing routes
|
||||
|
||||
function _submit_asset_edit($c, $response, $body, $user_id, $asset_id=-1) {
|
||||
$query = $c->queries['asset_edit']['submit'];
|
||||
$query->bindValue(':user_id', $user_id, PDO::PARAM_INT);
|
||||
$query->bindValue(':asset_id', $asset_id, PDO::PARAM_INT);
|
||||
|
||||
$error = _insert_asset_edit_fields($c, false, $response, $query, $body, $asset_id==-1);
|
||||
if($error) return $response;
|
||||
|
||||
$query->execute();
|
||||
$error = $c->utils->error_reponse_if_query_bad(false, $response, $query);
|
||||
if($error) return $response;
|
||||
|
||||
$id = $c->db->lastInsertId();
|
||||
|
||||
if(isset($body['previews'])) {
|
||||
$error = _add_previews_to_edit($c, $error, $response, $id, $body['previews'], $asset_id==-1);
|
||||
if($error) return $response;
|
||||
}
|
||||
|
||||
return $response->withJson([
|
||||
'id' => $id,
|
||||
'url' => 'asset/edit/' . $id,
|
||||
], 200);
|
||||
}
|
||||
|
||||
function _insert_asset_edit_fields($c, $error, &$response, $query, $body, $required=false) {
|
||||
if($error) return true;
|
||||
|
||||
foreach ($c->constants['asset_edit_fields'] as $i => $field) {
|
||||
if(!$required) {
|
||||
if(isset($body[$field])) {
|
||||
$query->bindValue(':' . $field, $body[$field]);
|
||||
} else {
|
||||
$query->bindValue(':' . $field, null, PDO::PARAM_NULL);
|
||||
}
|
||||
} else {
|
||||
$error = $c->utils->error_reponse_if_missing_or_not_string($error, $response, $body, $field);
|
||||
if(!$error) $query->bindValue(':' . $field, $body[$field]);
|
||||
}
|
||||
}
|
||||
return $error;
|
||||
}
|
||||
|
||||
function _add_previews_to_edit($c, $error, &$response, $edit_id, $previews, $required=false) {
|
||||
if($error) return true;
|
||||
|
||||
foreach ($previews as $i => $preview) {
|
||||
if(!isset($preview['enabled']) || !$preview['enabled']) continue;
|
||||
if($required || !isset($preview['edit_preview_id'])) {
|
||||
|
||||
$query = $c->queries['asset_edit']['add_preview'];
|
||||
|
||||
$error = $c->utils->error_reponse_if_missing_or_not_string($error, $response, $preview, 'operation');
|
||||
if($error) return $error;
|
||||
|
||||
$operation = $c->constants['edit_preview_operation']['insert'];
|
||||
|
||||
if(!$required && isset($c->constants['edit_preview_operation'][$preview['operation']])) {
|
||||
$operation = $c->constants['edit_preview_operation'][$preview['operation']];
|
||||
}
|
||||
$query->bindValue(':operation',(int) $operation, PDO::PARAM_INT);
|
||||
|
||||
if($operation == $c->constants['edit_preview_operation']['insert']) {
|
||||
$query->bindValue(':preview_id', -1, PDO::PARAM_INT);
|
||||
} else {
|
||||
$error = $c->utils->error_reponse_if_missing_or_not_string($error, $response, $preview, 'preview_id');
|
||||
if($error) return $error;
|
||||
$query->bindValue(':preview_id', (int) $preview['preview_id'], PDO::PARAM_INT);
|
||||
}
|
||||
|
||||
} elseif(isset($preview['remove']) && $preview['remove']) {
|
||||
|
||||
$query = $c->queries['asset_edit']['remove_preview'];
|
||||
$query->bindValue(':edit_preview_id', (int) $preview['edit_preview_id'], PDO::PARAM_INT);
|
||||
$query->bindValue(':edit_id', (int) $edit_id, PDO::PARAM_INT);
|
||||
$query->execute();
|
||||
$error = $c->utils->error_reponse_if_query_bad(false, $response, $query);
|
||||
if($error) return $error;
|
||||
|
||||
continue;
|
||||
} else {
|
||||
$query = $c->queries['asset_edit']['update_preview'];
|
||||
$error = $c->utils->error_reponse_if_missing_or_not_string($error, $response, $preview, 'edit_preview_id');
|
||||
if($error) return $error;
|
||||
$query->bindValue(':edit_preview_id', (int) $preview['edit_preview_id'], PDO::PARAM_INT);
|
||||
}
|
||||
$query->bindValue(':edit_id', (int) $edit_id, PDO::PARAM_INT);
|
||||
|
||||
foreach ($c->constants['asset_edit_preview_fields'] as $i => $field) {
|
||||
if(!$required) {
|
||||
if(isset($preview[$field])) {
|
||||
$query->bindValue(':' . $field, $preview[$field]);
|
||||
} else {
|
||||
$query->bindValue(':' . $field, null, PDO::PARAM_NULL);
|
||||
}
|
||||
} else {
|
||||
$error = $c->utils->error_reponse_if_missing_or_not_string($error, $response, $preview, $field);
|
||||
if(!$error) $query->bindValue(':' . $field, $preview[$field]);
|
||||
}
|
||||
}
|
||||
|
||||
if($error) return $error;
|
||||
$query->execute();
|
||||
$error = $c->utils->error_reponse_if_query_bad(false, $response, $query);
|
||||
if($error) return $error;
|
||||
}
|
||||
|
||||
return $error;
|
||||
}
|
||||
|
||||
|
||||
// Get an edit
|
||||
$get_edit = function ($request, $response, $args) {
|
||||
$query = $this->queries['asset_edit']['get_one'];
|
||||
$query->bindValue(':edit_id', (int) $args['id'], PDO::PARAM_INT);
|
||||
$query->execute();
|
||||
|
||||
$error = $this->utils->error_reponse_if_query_bad(false, $response, $query);
|
||||
$error = $this->utils->error_reponse_if_query_no_results($error, $response, $query);
|
||||
if($error) return $response;
|
||||
|
||||
$output = $query->fetchAll();
|
||||
|
||||
$previews = [];
|
||||
$unedited_previews = [];
|
||||
$unedited_previews_last_i = null;
|
||||
$asset_edit = [];
|
||||
|
||||
foreach ($output as $row) {
|
||||
|
||||
foreach ($row as $column => $value) {
|
||||
if($value!==null) {
|
||||
if($column==='edit_preview_id') {
|
||||
$previews[] = ['edit_preview_id' => $value];
|
||||
} elseif($column==='preview_id' || $column==='type' || $column==='link' || $column==='thumbnail') {
|
||||
$previews[count($previews) - 1][$column] = $value;
|
||||
} elseif($column==='operation') {
|
||||
$previews[count($previews) - 1][$column] = $this->constants['edit_preview_operation'][(int) $value];
|
||||
} elseif($column==='orig_type' || $column==='orig_link' || $column==='orig_thumbnail') {
|
||||
$previews[count($previews) - 1]['original'][substr($column, strlen('orig_'))] = $value;
|
||||
}
|
||||
elseif($column==='unedited_preview_id') {
|
||||
$unedited_previews[$value] = ['preview_id' => $value];
|
||||
$unedited_previews_last_i = $value;
|
||||
} elseif($column==='unedited_type' || $column==='unedited_link' || $column==='unedited_thumbnail') {
|
||||
$unedited_previews[$unedited_previews_last_i][substr($column, strlen('unedited_'))] = $value;
|
||||
}
|
||||
elseif($column==='status') {
|
||||
$asset_edit['status'] = $this->constants['edit_status'][(int) $value];
|
||||
} else {
|
||||
$asset_edit[$column] = $value;
|
||||
}
|
||||
} elseif($column!=='edit_preview_id' && $column!=='preview_id' && $column!=='type' && $column!=='link' && $column!=='thumbnail' && $column!=='operation') {
|
||||
$asset_edit[$column] = $value;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
foreach($previews as $preview) {
|
||||
if(isset($preview['preview_id']) && isset($unedited_previews[$preview['preview_id']])) {
|
||||
unset($unedited_previews[$preview['preview_id']]);
|
||||
}
|
||||
}
|
||||
$asset_edit['previews'] = array_merge($previews, array_values($unedited_previews));
|
||||
|
||||
if($asset_edit['asset_id'] != -1) {
|
||||
$query_asset = $this->queries['asset']['get_one_bare'];
|
||||
$query_asset->bindValue(':asset_id', (int) $asset_edit['asset_id'], PDO::PARAM_INT);
|
||||
$query_asset->execute();
|
||||
|
||||
$error = $this->utils->error_reponse_if_query_bad(false, $response, $query_asset);
|
||||
$error = $this->utils->error_reponse_if_query_no_results($error, $response, $query_asset);
|
||||
if($error) return $response;
|
||||
|
||||
$asset = $query_asset->fetchAll()[0];
|
||||
|
||||
$asset_edit['original'] = $asset;
|
||||
}
|
||||
|
||||
return $response->withJson($asset_edit, 200);
|
||||
};
|
||||
|
||||
// Binding to multiple routes
|
||||
$app->get('/asset/edit/{id}', $get_edit);
|
||||
if(isset($frontend) && $frontend) {
|
||||
$app->get('/asset/edit/{id}/edit', $get_edit);
|
||||
}
|
||||
|
||||
// Submit an asset
|
||||
$app->post('/asset', function ($request, $response, $args) {
|
||||
$body = $request->getParsedBody();
|
||||
@@ -8,27 +196,7 @@ $app->post('/asset', function ($request, $response, $args) {
|
||||
$error = $this->utils->ensure_logged_in(false, $response, $body, $user_id);
|
||||
if($error) return $response;
|
||||
|
||||
$query = $this->queries['asset_edit']['submit'];
|
||||
$query->bindValue(':user_id', $user_id, PDO::PARAM_INT);
|
||||
$query->bindValue(':asset_id', -1, PDO::PARAM_INT);
|
||||
|
||||
$error = false;
|
||||
foreach ($this->constants['asset_edit_fields'] as $i => $field) {
|
||||
$error = $this->utils->error_reponse_if_missing_or_not_string($error, $response, $body, $field);
|
||||
if(!$error) $query->bindValue(':' . $field, $body[$field]);
|
||||
}
|
||||
if($error) return $response;
|
||||
|
||||
$query->execute();
|
||||
$error = $this->utils->error_reponse_if_query_bad(false, $response, $query);
|
||||
if($error) return $response;
|
||||
|
||||
$id = $this->db->lastInsertId();
|
||||
|
||||
return $response->withJson([
|
||||
'id' => $id,
|
||||
'url' => 'asset/edit/' . $id,
|
||||
], 200);
|
||||
return _submit_asset_edit($this, $response, $body, $user_id, -1);
|
||||
});
|
||||
|
||||
|
||||
@@ -49,36 +217,13 @@ $app->post('/asset/{id}', function ($request, $response, $args) {
|
||||
|
||||
$asset = $query_asset->fetchAll()[0];
|
||||
|
||||
// Error out
|
||||
if((int) $asset['user_id'] !== (int) $user_id) {
|
||||
return $response->withJson([
|
||||
'error' => 'You are not authorized to update this asset',
|
||||
], 403);
|
||||
}
|
||||
|
||||
// Build query
|
||||
$query = $this->queries['asset_edit']['submit'];
|
||||
$query->bindValue(':user_id', $user_id, PDO::PARAM_INT);
|
||||
$query->bindValue(':asset_id', (int) $args['id'], PDO::PARAM_INT);
|
||||
|
||||
foreach ($this->constants['asset_edit_fields'] as $i => $field) {
|
||||
if(isset($body[$field])) {
|
||||
$query->bindValue(':' . $field, $body[$field]);
|
||||
} else {
|
||||
$query->bindValue(':' . $field, null, PDO::PARAM_NULL);
|
||||
}
|
||||
}
|
||||
|
||||
$query->execute();
|
||||
$error = $this->utils->error_reponse_if_query_bad(false, $response, $query);
|
||||
if($error) return $response;
|
||||
|
||||
$id = $this->db->lastInsertId();
|
||||
|
||||
return $response->withJson([
|
||||
'id' => $id,
|
||||
'url' => 'asset/edit/' . $id,
|
||||
], 200);
|
||||
return _submit_asset_edit($this, $response, $body, $user_id, (int) $args['id']);
|
||||
});
|
||||
|
||||
|
||||
@@ -90,7 +235,7 @@ $app->post('/asset/edit/{id}', function ($request, $response, $args) {
|
||||
if($error) return $response;
|
||||
|
||||
// Fetch the edit to check the user id
|
||||
$query_edit = $this->queries['asset_edit']['get_one'];
|
||||
$query_edit = $this->queries['asset_edit']['get_one_bare'];
|
||||
$query_edit->bindValue(':edit_id', (int) $args['id'], PDO::PARAM_INT);
|
||||
$query_edit->execute();
|
||||
|
||||
@@ -116,18 +261,18 @@ $app->post('/asset/edit/{id}', function ($request, $response, $args) {
|
||||
$query = $this->queries['asset_edit']['update'];
|
||||
$query->bindValue(':edit_id', (int) $args['id'], PDO::PARAM_INT);
|
||||
|
||||
foreach ($this->constants['asset_edit_fields'] as $i => $field) {
|
||||
if(isset($body[$field])) {
|
||||
$query->bindValue(':' . $field, $body[$field]);
|
||||
} else {
|
||||
$query->bindValue(':' . $field, null, PDO::PARAM_NULL);
|
||||
}
|
||||
}
|
||||
$error = _insert_asset_edit_fields($this, false, $response, $query, $body, false);
|
||||
if($error) return $response;
|
||||
|
||||
$query->execute();
|
||||
$error = $this->utils->error_reponse_if_query_bad(false, $response, $query);
|
||||
if($error) return $response;
|
||||
|
||||
if(isset($body['previews'])) {
|
||||
$error = _add_previews_to_edit($this, $error, $response, $args['id'], $body['previews'], false);
|
||||
if($error) return $response;
|
||||
}
|
||||
|
||||
return $response->withJson([
|
||||
'id' => $args['id'],
|
||||
'url' => 'asset/edit/' . $args['id'],
|
||||
@@ -135,43 +280,6 @@ $app->post('/asset/edit/{id}', function ($request, $response, $args) {
|
||||
});
|
||||
|
||||
|
||||
// Get an edit
|
||||
$app->get('/asset/edit/{id}', function ($request, $response, $args) {
|
||||
$body = $request->getParsedBody();
|
||||
|
||||
|
||||
$query = $this->queries['asset_edit']['get_one'];
|
||||
$query->bindValue(':edit_id', (int) $args['id'], PDO::PARAM_INT);
|
||||
$query->execute();
|
||||
|
||||
$error = $this->utils->error_reponse_if_query_bad(false, $response, $query);
|
||||
$error = $this->utils->error_reponse_if_query_no_results($error, $response, $query);
|
||||
if($error) return $response;
|
||||
|
||||
$asset_edit = $query->fetchAll()[0];
|
||||
|
||||
if($asset_edit['asset_id'] != -1) {
|
||||
$query_asset = $this->queries['asset']['get_one_bare'];
|
||||
$query_asset->bindValue(':asset_id', (int) $asset_edit['asset_id'], PDO::PARAM_INT);
|
||||
$query_asset->execute();
|
||||
|
||||
$error = $this->utils->error_reponse_if_query_bad(false, $response, $query_asset);
|
||||
$error = $this->utils->error_reponse_if_query_no_results($error, $response, $query_asset);
|
||||
if($error) return $response;
|
||||
|
||||
$asset = $query_asset->fetchAll()[0];
|
||||
|
||||
$asset_edit['original'] = $asset;
|
||||
}
|
||||
|
||||
if(isset($this->constants['edit_status'][$asset_edit['status']])) {
|
||||
$asset_edit['status'] = $this->constants['edit_status'][$asset_edit['status']];
|
||||
}
|
||||
|
||||
return $response->withJson($asset_edit, 200);
|
||||
});
|
||||
|
||||
|
||||
// Accept an edit
|
||||
$app->post('/asset/edit/{id}/accept', function ($request, $response, $args) {
|
||||
$body = $request->getParsedBody();
|
||||
@@ -183,7 +291,7 @@ $app->post('/asset/edit/{id}/accept', function ($request, $response, $args) {
|
||||
if($error) return $response;
|
||||
|
||||
// Get the edit
|
||||
$query_edit = $this->queries['asset_edit']['get_one'];
|
||||
$query_edit = $this->queries['asset_edit']['get_one_bare'];
|
||||
$query_edit->bindValue(':edit_id', (int) $args['id'], PDO::PARAM_INT);
|
||||
$query_edit->execute();
|
||||
|
||||
@@ -191,7 +299,8 @@ $app->post('/asset/edit/{id}/accept', function ($request, $response, $args) {
|
||||
$error = $this->utils->error_reponse_if_query_no_results($error, $response, $query_edit);
|
||||
if($error) return $response;
|
||||
|
||||
$asset_edit = $query_edit->fetchAll()[0];
|
||||
$asset_edit_previews = $query_edit->fetchAll();
|
||||
$asset_edit = $asset_edit_previews[0];
|
||||
if((int) $asset_edit['status'] !== $this->constants['edit_status']['in_review']) {
|
||||
return $response->withJson([
|
||||
'error' => 'The edit should be in review in order to be accepted',
|
||||
@@ -243,14 +352,42 @@ $app->post('/asset/edit/{id}/accept', function ($request, $response, $args) {
|
||||
if((int) $asset_edit['asset_id'] === -1) {
|
||||
$asset_edit['asset_id'] = $this->db->lastInsertId();
|
||||
|
||||
$query_update_version = $this->queries['asset_edit']['set_asset_id'];
|
||||
$query_update_id = $this->queries['asset_edit']['set_asset_id'];
|
||||
|
||||
$query_update_version->bindValue(':edit_id', (int) $args['id'], PDO::PARAM_INT);
|
||||
$query_update_version->bindValue(':asset_id', (int) $asset_edit['asset_id'], PDO::PARAM_INT);
|
||||
$query_update_id->bindValue(':edit_id', (int) $args['id'], PDO::PARAM_INT);
|
||||
$query_update_id->bindValue(':asset_id', (int) $asset_edit['asset_id'], PDO::PARAM_INT);
|
||||
|
||||
$query_update_version->execute();
|
||||
$query_update_id->execute();
|
||||
|
||||
$error = $this->utils->error_reponse_if_query_bad(false, $response, $query_update_version);
|
||||
$error = $this->utils->error_reponse_if_query_bad(false, $response, $query_update_id);
|
||||
if($error) return $response;
|
||||
}
|
||||
|
||||
foreach($asset_edit_previews as $i => $preview) {
|
||||
if(!isset($preview['edit_preview_id']) || $preview['edit_preview_id'] == null) continue;
|
||||
$operation = $this->constants['edit_preview_operation'][$preview['operation']];
|
||||
$query_apply_preview = $this->queries['asset']['apply_preview_edit_' . $operation];
|
||||
|
||||
if($operation == 'insert') {
|
||||
$query_apply_preview->bindValue(':asset_id', (int) $asset_edit['asset_id']);
|
||||
}
|
||||
|
||||
if($operation == 'remove' || $operation == 'update') {
|
||||
$query_apply_preview->bindValue(':preview_id', (int) $asset_edit['preview_id']);
|
||||
}
|
||||
|
||||
if($operation == 'insert' || $operation == 'update') {
|
||||
foreach ($this->constants['asset_edit_preview_fields'] as $i => $field) {
|
||||
if(isset($preview[$field])) {
|
||||
$query_apply_preview->bindValue(':' . $field, $preview[$field]);
|
||||
} else {
|
||||
$query_apply_preview->bindValue(':' . $field, null, PDO::PARAM_NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$query_apply_preview->execute();
|
||||
$error = $this->utils->error_reponse_if_query_bad(false, $response, $query_apply_preview);
|
||||
if($error) return $response;
|
||||
}
|
||||
|
||||
@@ -270,7 +407,7 @@ $app->post('/asset/edit/{id}/review', function ($request, $response, $args) {
|
||||
if($error) return $response;
|
||||
|
||||
// Get the edit
|
||||
$query_edit = $this->queries['asset_edit']['get_one'];
|
||||
$query_edit = $this->queries['asset_edit']['get_one_bare'];
|
||||
$query_edit->bindValue(':edit_id', (int) $args['id'], PDO::PARAM_INT);
|
||||
$query_edit->execute();
|
||||
|
||||
@@ -298,6 +435,7 @@ $app->post('/asset/edit/{id}/review', function ($request, $response, $args) {
|
||||
if($error) return $response;
|
||||
|
||||
$asset_edit['status'] = 'in_review'; // Prepare to send
|
||||
$asset_edit['url'] = 'asset/edit/' . $args['id'];
|
||||
|
||||
return $response->withJson($asset_edit, 200);
|
||||
});
|
||||
@@ -326,5 +464,6 @@ $app->post('/asset/edit/{id}/reject', function ($request, $response, $args) {
|
||||
|
||||
return $response->withJson([
|
||||
'rejected' => true,
|
||||
'url' => 'asset/edit/' . $args['id'],
|
||||
], 200);
|
||||
});
|
||||
|
||||
@@ -123,6 +123,11 @@ $app->post('/login', function ($request, $response, $args) {
|
||||
'token' => $token,
|
||||
'authenticated' => true,
|
||||
], 200);
|
||||
} else {
|
||||
return $response->withJson([
|
||||
'authenticated' => false,
|
||||
'url' => 'login',
|
||||
], 403);
|
||||
}
|
||||
});
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@ $_asset_values = array_merge([
|
||||
'icon_url' => '',
|
||||
'description' => '',
|
||||
'cost' => '',
|
||||
'previews' => [],
|
||||
], $_asset_values);
|
||||
?>
|
||||
<div class="form-group">
|
||||
@@ -86,10 +87,90 @@ $_asset_values = array_merge([
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label class="col-md-4 control-label" for="youtube">Youtube Link</label>
|
||||
<div class="col-md-5">
|
||||
<input id="youtube" name="youtube" type="text" placeholder="Youtube Link" class="form-control input-md">
|
||||
<span class="help-block">Set the youtube link demonstrating your asset</span>
|
||||
<?php for ($i=0; $i < count($_asset_values['previews']) + 3; $i++) {
|
||||
if($i < count($_asset_values['previews'])) $preview = $_asset_values['previews'][$i];
|
||||
else $preview = ['type' => 'image', 'link' => '', 'thumbnail' => '']
|
||||
?>
|
||||
<div class="panel panel-default">
|
||||
<div class="panel-heading form-inline">
|
||||
<div class="text-center">
|
||||
<span class="panel-title">
|
||||
<?php if($i < count($_asset_values['previews'])) {
|
||||
if(isset($preview['edit_preview_id'])) {
|
||||
echo 'Revise ' . $preview['operation'] . ' operation';
|
||||
} else {
|
||||
echo 'Update original preview';
|
||||
}
|
||||
} else {
|
||||
echo 'Add preview';
|
||||
} ?>
|
||||
</span>
|
||||
|
||||
<?php if($i < count($_asset_values['previews'])) { ?>
|
||||
<?php if(isset($preview['edit_preview_id'])) { // Existing edit ?>
|
||||
|
||||
<input type="hidden" name="previews[<?php echo $i ?>][edit_preview_id]" value="<?php echo $preview['edit_preview_id'] ?>">
|
||||
<input type="hidden" name="previews[<?php echo $i ?>][enabled]" value="true">
|
||||
<label>
|
||||
<input type="checkbox" name="previews[<?php echo $i ?>][remove]" value="true">
|
||||
Cancel edit
|
||||
</label>
|
||||
|
||||
<?php } else { // From base asset ?>
|
||||
<input type="hidden" name="previews[<?php echo $i ?>][preview_id]" value="<?php echo $preview['preview_id'] ?>">
|
||||
<label>
|
||||
<input type="checkbox" name="previews[<?php echo $i ?>][enabled]" value="true">
|
||||
Enable
|
||||
</label>
|
||||
<label>
|
||||
<input type="radio" name="previews[<?php echo $i ?>][operation]" value="update" checked="">
|
||||
Update
|
||||
</label>
|
||||
<label>
|
||||
<input type="radio" name="previews[<?php echo $i ?>][operation]" value="remove">
|
||||
Remove
|
||||
</label>
|
||||
|
||||
<?php } ?>
|
||||
<?php } else { ?>
|
||||
<input type="hidden" name="previews[<?php echo $i ?>][operation]" value="insert">
|
||||
<label>
|
||||
<input type="checkbox" name="previews[<?php echo $i ?>][enabled]" value="true">
|
||||
Enable
|
||||
</label>
|
||||
<?php } ?>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="panel-body">
|
||||
<div class="form-group">
|
||||
<label class="col-md-4 control-label" for="previews[<?php echo $i ?>][type]">Type</label>
|
||||
<div class="col-md-5">
|
||||
<select id="license" name="previews[<?php echo $i ?>][type]" class="form-control">
|
||||
<?php $types = ['image' => 'Image', 'video' => 'Video'] ?>
|
||||
<?php foreach($types as $id => $name) { ?>
|
||||
<option value="<?php echo $id ?>" <?php if($id == $preview['type']) echo 'selected=""'; ?>>
|
||||
<?php echo $name ?>
|
||||
</option>
|
||||
<?php } ?>
|
||||
</select>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label class="control-label col-md-4" for="previews[<?php echo $i ?>][link]">Image/Youtube Link</label>
|
||||
<div class="col-md-5">
|
||||
<input id="youtube-<?php echo $i ?>" name="previews[<?php echo $i ?>][link]" type="text" placeholder="Image/Youtube Link" class="form-control input-md" value="<?php echo $preview['link'] ?>">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="form-group">
|
||||
<label class="control-label col-md-4" for="previews[<?php echo $i ?>][thumbnail]">Link to thumbnail (To be removed)</label>
|
||||
<div class="col-md-5">
|
||||
<input id="youtube-<?php echo $i ?>" name="previews[<?php echo $i ?>][thumbnail]" type="text" placeholder="Image Link" class="form-control input-md" value="<?php echo $preview['thumbnail'] ?>">
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<?php } ?>
|
||||
|
||||
@@ -8,17 +8,43 @@
|
||||
'download_url' => 'Download Url',
|
||||
'browse_url' => 'Browse Url',
|
||||
'icon_url' => 'Icon Url',
|
||||
] ?>
|
||||
<?php function output_field($data, $name) { ?>
|
||||
<?php if (strpos($name, 'url') !== false) { ?>
|
||||
];
|
||||
$preview_field_names = [
|
||||
'type' => 'Type',
|
||||
'link' => 'Image/Video URL',
|
||||
'thumbnail' => 'Thumbnail',
|
||||
]; ?>
|
||||
<?php function output_field($data, $name) { $data = htmlspecialchars($data);?>
|
||||
<?php if (strpos($name, 'url') !== false || strpos($name, 'link') !== false || strpos($name, 'thumbnail') !== false) { ?>
|
||||
<a href="<?php echo $data ?>"><?php echo $data ?></a>
|
||||
<?php if ($name == 'icon_url') { ?>
|
||||
<br><img src="<?php echo $data ?>" width="80" height="80"></a>
|
||||
<?php }?>
|
||||
<?php if ($name == 'preview_link') { ?>
|
||||
<br><img src="<?php echo $data ?>" style="max-height:80px"></a>
|
||||
<?php }?>
|
||||
<?php if ($name == 'preview_thumbnail') { ?>
|
||||
<br><img src="<?php echo $data ?>" style="max-height:345px"></a>
|
||||
<?php }?>
|
||||
<?php } else { ?>
|
||||
<?php echo $data ?>
|
||||
<?php } ?>
|
||||
<?php } ?>
|
||||
<h1>
|
||||
<?php if(isset($data['original'])) { ?>
|
||||
Edit of asset
|
||||
<a href="<?php echo $basepath ?>/asset/<?php echo $data['asset_id'] ?>">"<?php echo $data['original']['title'] ?>"</a>
|
||||
<?php } else { ?>
|
||||
Creation of asset
|
||||
<a href="<?php echo $basepath ?>/asset/<?php echo $data['asset_id'] ?>">"<?php echo $data['title'] ?>"</a>
|
||||
<?php } ?>
|
||||
<span class="label label-<?php echo ['new' => 'info', 'in_review' => 'primary', 'rejected' => 'danger', 'accepted' => 'success'][$data['status']] ?>">
|
||||
<?php echo ucfirst(str_replace('_', ' ', $data['status'])) ?>
|
||||
</span>
|
||||
</h1>
|
||||
<?php if($data['user_id'] == $user['id'] && $data['status'] == 'new') { ?>
|
||||
<a class="btn btn-success" href="<?php echo $basepath ?>/asset/edit/<?php echo $data['edit_id'] ?>/edit">Revise</a>
|
||||
<?php } ?>
|
||||
<table class="table table-bordered">
|
||||
<tbody>
|
||||
<tr>
|
||||
@@ -55,20 +81,75 @@
|
||||
<?php } ?>
|
||||
</tr>
|
||||
<?php } ?>
|
||||
<?php foreach($data['previews'] as $i => $preview) if(isset($preview['edit_preview_id'])) { ?>
|
||||
<tr>
|
||||
<th colspan="3" class="text-center">
|
||||
Preview
|
||||
<span class="label label-danger"><?php output_field(ucfirst($preview['operation']), 'preview_operation') ?></span>
|
||||
</th>
|
||||
</tr>
|
||||
<?php foreach($preview_field_names as $field => $name) { ?>
|
||||
<tr>
|
||||
<td>
|
||||
<?php echo $name ?>
|
||||
</td>
|
||||
<?php if(isset($preview['original']) && $preview['operation'] != "remove" && ($preview[$field] === null || $preview[$field] === $preview['original'][$field])) { ?>
|
||||
|
||||
<td colspan="2" class="text-center active">
|
||||
<?php output_field($preview['original'][$field], 'preview_' . $field) ?>
|
||||
</td>
|
||||
|
||||
<?php } else { ?>
|
||||
<?php if(isset($preview['original'])) { ?>
|
||||
|
||||
<?php if($preview['operation'] == "remove") { ?>
|
||||
<td class="text-center danger" colspan="2">
|
||||
<?php output_field($preview['original'][$field], 'preview_' . $field) ?>
|
||||
</td>
|
||||
<?php } else { ?>
|
||||
<td class="text-right danger">
|
||||
<?php output_field($preview['original'][$field], 'preview_' . $field) ?>
|
||||
</td>
|
||||
<td class="text-left success">
|
||||
<?php output_field($preview[$field], 'preview_' . $field) ?>
|
||||
</td>
|
||||
<?php } ?>
|
||||
|
||||
<?php } else { ?>
|
||||
<td class="text-center success" colspan="2">
|
||||
<?php output_field($preview[$field], 'preview_' . $field) ?>
|
||||
</td>
|
||||
<?php } ?>
|
||||
|
||||
<?php } ?>
|
||||
</tr>
|
||||
<?php } ?>
|
||||
<?php } ?>
|
||||
</tbody>
|
||||
</table>
|
||||
<?php if(isset($user)) { ?>
|
||||
<?php if($user['type'] >= 100) { ?>
|
||||
<form class="form-inline" style="display: inline-block" action="<?php echo $basepath ?>/asset/edit/<?php echo $data['edit_id']; ?>/accept" method="post">
|
||||
<button type="submit" class="btn btn-success">Accept</button>
|
||||
</form>
|
||||
<form class="form-inline" style="display: inline-block" action="<?php echo $basepath ?>/asset/edit/<?php echo $data['edit_id']; ?>/reject" method="post">
|
||||
<div class="form-group">
|
||||
<button type="submit" class="btn btn-danger">Reject</button>
|
||||
<label class="control-label" for="reason">Reason:</label>
|
||||
<input type="text" class="form-control" id="reason" name="reason" rows="3"></textarea>
|
||||
</div>
|
||||
</form>
|
||||
<?php if($user['type'] >= 50) { ?>
|
||||
<?php if($data['status'] == 'new') { ?>
|
||||
<form class="form-inline" action="<?php echo $basepath ?>/asset/edit/<?php echo $data['edit_id']; ?>/review" method="post">
|
||||
<button type="submit" class="btn btn-primary">Put in queue</button>
|
||||
</form>
|
||||
<?php } elseif($data['status'] == 'in_review') { ?>
|
||||
<form class="form-inline" action="<?php echo $basepath ?>/asset/edit/<?php echo $data['edit_id']; ?>/accept" method="post">
|
||||
<div class="form-group panel">
|
||||
<button type="submit" class="btn btn-success">Accept</button>
|
||||
<label class="control-label" for="hash">Hash:</label>
|
||||
<input type="text" class="form-control" id="hash" name="hash">
|
||||
</div>
|
||||
</form>
|
||||
|
||||
<form class="form-inline" action="<?php echo $basepath ?>/asset/edit/<?php echo $data['edit_id']; ?>/reject" method="post">
|
||||
<div class="form-group panel">
|
||||
<button type="submit" class="btn btn-danger">Reject</button>
|
||||
<label class="control-label" for="reason">Reason:</label>
|
||||
<input type="text" class="form-control" id="reason" name="reason">
|
||||
</div>
|
||||
</form>
|
||||
<?php } ?>
|
||||
<?php } ?>
|
||||
<?php } ?>
|
||||
<?php include("_footer.phtml") ?>
|
||||
|
||||
27
templates/edit_asset_edit.phtml
Normal file
27
templates/edit_asset_edit.phtml
Normal file
@@ -0,0 +1,27 @@
|
||||
<?php include("_header.phtml") ?>
|
||||
<?php $_asset_values = $data ?>
|
||||
<form class="form-horizontal" action="<?php echo $basepath ?>/asset/edit/<?php echo $data['edit_id']; ?>" method="post">
|
||||
<fieldset>
|
||||
<!-- Form Name -->
|
||||
<legend>
|
||||
Revise edit
|
||||
<a class="btn btn-default btn-sm" href="<?php echo $basepath ?>/asset/edit/<?php echo $data['edit_id'] ?>">
|
||||
Back
|
||||
</a>
|
||||
</legend>
|
||||
|
||||
<?php include("_asset_fields.phtml") ?>
|
||||
|
||||
<div class="form-group">
|
||||
<label class="col-md-4 control-label" for="submit"></label>
|
||||
<div class="col-md-4">
|
||||
<button id="submit" class="btn btn-primary">Revise edit</button>
|
||||
<a class="btn btn-default" href="<?php echo $basepath ?>/asset/edit/<?php echo $data['edit_id'] ?>">
|
||||
Cancel
|
||||
</a>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</fieldset>
|
||||
</form>
|
||||
<?php include("_footer.phtml") ?>
|
||||
Reference in New Issue
Block a user