81 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			PHP
		
	
	
	
<?php
 | 
						|
 | 
						|
$_dr = $_SERVER['DOCUMENT_ROOT'];
 | 
						|
// TODO: Make configurable in .ini
 | 
						|
 | 
						|
// Actual filesystem
 | 
						|
$GLOBALS['path_root'] = '/srv/http/boorein';
 | 
						|
$GLOBALS['path_media'] = $GLOBALS['path_root'] . '/media';
 | 
						|
$GLOBALS['path_mediadb'] = $GLOBALS['path_root'] . '/media.db';
 | 
						|
// Uri addressed
 | 
						|
$GLOBALS['base_root'] =
 | 
						|
  $_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'];
 | 
						|
$GLOBALS['base_media'] = 'media';
 | 
						|
 | 
						|
header('Content-Type: application/json');
 | 
						|
 | 
						|
 | 
						|
include_once($_dr . '/item.php');
 | 
						|
include_once($_dr . '/mediadb.php');
 | 
						|
include_once($_dr . '/json.php');
 | 
						|
 | 
						|
 | 
						|
// ----- ROUTER -----
 | 
						|
(match ([$_SERVER['DOCUMENT_URI'], $_SERVER['REQUEST_METHOD']]) {
 | 
						|
  ['/item',   'POST'] => post_item(),
 | 
						|
  ['/item',   'GET']  => get_item(),
 | 
						|
  ['/search', 'GET']  => get_search(),
 | 
						|
  default  => Json::error('Not implemented')
 | 
						|
})->die();
 | 
						|
 | 
						|
 | 
						|
function get_item()
 | 
						|
{
 | 
						|
  $id = $_GET['q'] ?? false;
 | 
						|
  if (!$id) Json::error('ID not specified')->die();
 | 
						|
 | 
						|
  $media_db = new MediaDB();
 | 
						|
 | 
						|
  $item = Item::load($media_db, $id);
 | 
						|
 | 
						|
  if ($item === null) {
 | 
						|
    Json::error('No item was found with the given ID')->die();
 | 
						|
  }
 | 
						|
 | 
						|
  return $item->getJson();
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
function post_item()
 | 
						|
{
 | 
						|
  // The checks are performed internally
 | 
						|
  $item = Item::upload($_FILES['file'], $_POST['tags']);
 | 
						|
 | 
						|
  return $item->getJson();
 | 
						|
};
 | 
						|
 | 
						|
 | 
						|
function get_search()
 | 
						|
{
 | 
						|
  $query = $_GET['q'] ?? '';
 | 
						|
  $limit = intval($_GET['limit'] ?? '20');
 | 
						|
  // TODO: Implement page
 | 
						|
 | 
						|
  // If intval returns 0, it's an error
 | 
						|
  if ($limit == 0) return Json::error('Invalid limit parameter');
 | 
						|
  if ($query !== '') return Json::error('Search not implemented yet');
 | 
						|
 | 
						|
  $list = [];
 | 
						|
 | 
						|
  $db = new MediaDB();
 | 
						|
  $db->map(function ($line) use (&$list, $limit) {
 | 
						|
    if (count($list) >= $limit) return true;
 | 
						|
 | 
						|
    $list[] = Item::fromLine($line);
 | 
						|
 | 
						|
    return false;
 | 
						|
  });
 | 
						|
 | 
						|
  return Json::new($list);
 | 
						|
}
 |