trying to implement database backend
This commit is contained in:
parent
e174e3d16a
commit
5546a3f3bd
@ -1,2 +0,0 @@
|
|||||||
ARG NEXTCLOUD_VERSION=20.0.0
|
|
||||||
FROM rootlogin/nextcloud
|
|
@ -37,7 +37,7 @@ Mount or move the ``radio`` folder into your Nextcloud ``apps/`` directory. Go t
|
|||||||
|
|
||||||
Can be easily tested using Docker:
|
Can be easily tested using Docker:
|
||||||
```
|
```
|
||||||
docker build -t nextcloud .
|
docker build -t nextcloud https://git.project-insanity.org/onny/docker-nextcloud.git
|
||||||
docker run -v /tmp/nextcloud-app-radio:/opt/nextcloud/apps/radio -d --name nextcloud-app-radio -p 80:80 nextcloud
|
docker run -v /tmp/nextcloud-app-radio:/opt/nextcloud/apps/radio -d --name nextcloud-app-radio -p 80:80 nextcloud
|
||||||
```
|
```
|
||||||
First part of -v is the path to the cloned and compiled or downloaded Nextcloud Radio app. Debug running container it with:
|
First part of -v is the path to the cloned and compiled or downloaded Nextcloud Radio app. Debug running container it with:
|
||||||
|
@ -14,7 +14,7 @@
|
|||||||
<bugs>https://git.project-insanity.org/onny/nextcloud-app-radio/issues</bugs>
|
<bugs>https://git.project-insanity.org/onny/nextcloud-app-radio/issues</bugs>
|
||||||
<screenshot>https://git.project-insanity.org/onny/nextcloud-app-radio/raw/master/screenshot.png</screenshot>
|
<screenshot>https://git.project-insanity.org/onny/nextcloud-app-radio/raw/master/screenshot.png</screenshot>
|
||||||
<dependencies>
|
<dependencies>
|
||||||
<nextcloud min-version="19" max-version="20"/>
|
<nextcloud min-version="20" max-version="20"/>
|
||||||
</dependencies>
|
</dependencies>
|
||||||
<commands>
|
<commands>
|
||||||
<command>OCA\Radio\Command\Search</command>
|
<command>OCA\Radio\Command\Search</command>
|
||||||
|
@ -1,51 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace OCA\Radio\Command;
|
|
||||||
|
|
||||||
use OCA\Radio\Service\SearchService;
|
|
||||||
use OCA\Mail\Service\CleanupService;
|
|
||||||
use Symfony\Component\Console\Command\Command;
|
|
||||||
use Symfony\Component\Console\Input\InputArgument;
|
|
||||||
use Symfony\Component\Console\Input\InputInterface;
|
|
||||||
use Symfony\Component\Console\Output\OutputInterface;
|
|
||||||
|
|
||||||
class Search extends Command {
|
|
||||||
|
|
||||||
/** @var CleanupService */
|
|
||||||
private $cleanupService;
|
|
||||||
/**
|
|
||||||
* @var SearchService
|
|
||||||
*/
|
|
||||||
private $searchService;
|
|
||||||
|
|
||||||
public function __construct(SearchService $searchService) {
|
|
||||||
parent::__construct();
|
|
||||||
|
|
||||||
$this->searchService = $searchService;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @return void
|
|
||||||
*/
|
|
||||||
protected function configure() {
|
|
||||||
$this->setName('radio:search');
|
|
||||||
$this->setDescription('Search for radio stations');
|
|
||||||
|
|
||||||
$this->addArgument("term", InputArgument::OPTIONAL);
|
|
||||||
}
|
|
||||||
|
|
||||||
protected function execute(InputInterface $input, OutputInterface $output): int {
|
|
||||||
$radioStations = $this->searchService->findRadioStations(
|
|
||||||
$input->getArgument("term")
|
|
||||||
);
|
|
||||||
|
|
||||||
$output->writeln("Found radio stations");
|
|
||||||
foreach ($radioStations as $radioStation) {
|
|
||||||
$output->writeln("* $radioStation");
|
|
||||||
}
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
@ -15,8 +15,6 @@ class StationController extends Controller {
|
|||||||
/** @var string */
|
/** @var string */
|
||||||
private $userId;
|
private $userId;
|
||||||
|
|
||||||
use Errors;
|
|
||||||
|
|
||||||
public function __construct(IRequest $request,
|
public function __construct(IRequest $request,
|
||||||
StationService $service,
|
StationService $service,
|
||||||
$userId) {
|
$userId) {
|
||||||
|
@ -1,59 +0,0 @@
|
|||||||
<?php
|
|
||||||
|
|
||||||
declare(strict_types=1);
|
|
||||||
|
|
||||||
namespace OCA\Radio\Service;
|
|
||||||
|
|
||||||
use Exception;
|
|
||||||
use OCP\Http\Client\IClientService;
|
|
||||||
use Psr\Log\LoggerInterface;
|
|
||||||
use function array_filter;
|
|
||||||
use function array_map;
|
|
||||||
use function json_decode;
|
|
||||||
use function mb_strpos;
|
|
||||||
use function mb_strtolower;
|
|
||||||
|
|
||||||
class SearchService {
|
|
||||||
|
|
||||||
/** @var IClientService */
|
|
||||||
private $clientService;
|
|
||||||
|
|
||||||
/** @var LoggerInterface */
|
|
||||||
private $logger;
|
|
||||||
|
|
||||||
public function __construct(IClientService $clientService,
|
|
||||||
LoggerInterface $logger) {
|
|
||||||
$this->clientService = $clientService;
|
|
||||||
$this->logger = $logger;
|
|
||||||
}
|
|
||||||
|
|
||||||
public function findRadioStations(?string $term = null): array {
|
|
||||||
$this->logger->debug('searching radio stations');
|
|
||||||
|
|
||||||
$client = $this->clientService->newClient();
|
|
||||||
|
|
||||||
try {
|
|
||||||
$response = $client->get("https://cat-fact.herokuapp.com/facts?animal_type=cat");
|
|
||||||
} catch (Exception $e) {
|
|
||||||
$this->logger->error("Could not search for radio stations. Please check connection to radio-browser API.");
|
|
||||||
|
|
||||||
throw $e;
|
|
||||||
}
|
|
||||||
|
|
||||||
$body = $response->getBody();
|
|
||||||
$parsed = json_decode($body, true);
|
|
||||||
|
|
||||||
$mapped = array_map(function(array $radioStation) {
|
|
||||||
return $radioStation['text'];
|
|
||||||
}, $parsed['all']);
|
|
||||||
|
|
||||||
if (empty($term)) {
|
|
||||||
return $mapped;
|
|
||||||
}
|
|
||||||
|
|
||||||
return array_filter($mapped, function(string $radioStation) use ($term) {
|
|
||||||
return mb_strpos(mb_strtolower($radioStation), mb_strtolower($term));
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
@ -1,48 +1,76 @@
|
|||||||
<?php
|
<?php
|
||||||
|
|
||||||
declare(strict_types=1);
|
namespace OCA\Radio\Service;
|
||||||
|
|
||||||
namespace OCA\Radio\Migration;
|
use Exception;
|
||||||
|
|
||||||
use Closure;
|
use OCP\AppFramework\Db\DoesNotExistException;
|
||||||
use OCP\DB\ISchemaWrapper;
|
use OCP\AppFramework\Db\MultipleObjectsReturnedException;
|
||||||
use OCP\Migration\SimpleMigrationStep;
|
|
||||||
use OCP\Migration\IOutput;
|
|
||||||
|
|
||||||
class Version000000Date20181013124731 extends SimpleMigrationStep {
|
use OCA\Radio\Db\Station;
|
||||||
|
use OCA\Radio\Db\StationMapper;
|
||||||
|
|
||||||
/**
|
class StationService {
|
||||||
* @param IOutput $output
|
|
||||||
* @param Closure $schemaClosure The `\Closure` returns a `ISchemaWrapper`
|
|
||||||
* @param array $options
|
|
||||||
* @return null|ISchemaWrapper
|
|
||||||
*/
|
|
||||||
public function changeSchema(IOutput $output, Closure $schemaClosure, array $options) {
|
|
||||||
/** @var ISchemaWrapper $schema */
|
|
||||||
$schema = $schemaClosure();
|
|
||||||
|
|
||||||
if (!$schema->hasTable('radio')) {
|
/** @var StationMapper */
|
||||||
$table = $schema->createTable('radio');
|
private $mapper;
|
||||||
$table->addColumn('id', 'integer', [
|
|
||||||
'autoincrement' => true,
|
|
||||||
'notnull' => true,
|
|
||||||
]);
|
|
||||||
$table->addColumn('title', 'string', [
|
|
||||||
'notnull' => true,
|
|
||||||
'length' => 200
|
|
||||||
]);
|
|
||||||
$table->addColumn('user_id', 'string', [
|
|
||||||
'notnull' => true,
|
|
||||||
'length' => 200,
|
|
||||||
]);
|
|
||||||
$table->addColumn('content', 'text', [
|
|
||||||
'notnull' => true,
|
|
||||||
'default' => ''
|
|
||||||
]);
|
|
||||||
|
|
||||||
$table->setPrimaryKey(['id']);
|
public function __construct(StationMapper $mapper) {
|
||||||
$table->addIndex(['user_id'], 'radio_user_id_index');
|
$this->mapper = $mapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function findAll(string $userId): array {
|
||||||
|
return $this->mapper->findAll($userId);
|
||||||
|
}
|
||||||
|
|
||||||
|
private function handleException(Exception $e): void {
|
||||||
|
if ($e instanceof DoesNotExistException ||
|
||||||
|
$e instanceof MultipleObjectsReturnedException) {
|
||||||
|
throw new StationNotFound($e->getMessage());
|
||||||
|
} else {
|
||||||
|
throw $e;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function find($id, $userId) {
|
||||||
|
try {
|
||||||
|
return $this->mapper->find($id, $userId);
|
||||||
|
|
||||||
|
// in order to be able to plug in different storage backends like files
|
||||||
|
// for instance it is a good idea to turn storage related exceptions
|
||||||
|
// into service related exceptions so controllers and service users
|
||||||
|
// have to deal with only one type of exception
|
||||||
|
} catch (Exception $e) {
|
||||||
|
$this->handleException($e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function create($title, $content, $userId) {
|
||||||
|
$station = new Station();
|
||||||
|
$station->setTitle($title);
|
||||||
|
$station->setContent($content);
|
||||||
|
$station->setUserId($userId);
|
||||||
|
return $this->mapper->insert($station);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function update($id, $title, $content, $userId) {
|
||||||
|
try {
|
||||||
|
$station = $this->mapper->find($id, $userId);
|
||||||
|
$station->setTitle($title);
|
||||||
|
$station->setContent($content);
|
||||||
|
return $this->mapper->update($station);
|
||||||
|
} catch (Exception $e) {
|
||||||
|
$this->handleException($e);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public function delete($id, $userId) {
|
||||||
|
try {
|
||||||
|
$station = $this->mapper->find($id, $userId);
|
||||||
|
$this->mapper->delete($station);
|
||||||
|
return $station;
|
||||||
|
} catch (Exception $e) {
|
||||||
|
$this->handleException($e);
|
||||||
}
|
}
|
||||||
return $schema;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -98,7 +98,7 @@ export default {
|
|||||||
title: 'test',
|
title: 'test',
|
||||||
content: 'testhallo',
|
content: 'testhallo',
|
||||||
}
|
}
|
||||||
const response = await axios.post(generateUrl('/apps/radio/station'), station)
|
const response = await axios.post(generateUrl('/apps/radio/stations'), station)
|
||||||
console.log(response)
|
console.log(response)
|
||||||
// const index = this.stations.findIndex((match) => match.id === this.currentStationId)
|
// const index = this.stations.findIndex((match) => match.id === this.currentStationId)
|
||||||
// this.$set(this.stations, index, response.data)
|
// this.$set(this.stations, index, response.data)
|
||||||
|
Loading…
Reference in New Issue
Block a user