This commit is contained in:
Patrick Niebeling
2025-03-12 11:29:30 +01:00
parent 9538c99576
commit 1e46c19f1b
14 changed files with 202 additions and 130 deletions

View File

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<appinfo>
<id>deckflow</id>
<name>Deckflow</name>
<description>Automatische Workflows für Nextcloud Decks</description>
<version>1.0.0</version>
<author>Dein Name</author>
<license>GPL-3.0</license>
</appinfo>

25
appinfo/app.php Normal file
View File

@ -0,0 +1,25 @@
<?php
namespace OCA\Deckflow\AppInfo;
use OCP\AppFramework\App;
use OCP\IContainer;
use OCA\Deckflow\Controller\DeckflowController;
use OCA\Deckflow\Migrations\Version20250312000000; // Migration importieren
class Application extends App {
public function __construct(array $urlParams = []) {
parent::__construct('deckflow', $urlParams);
// Controller registrieren
$container = $this->getContainer();
$container->registerService('DeckflowController', function (IContainer $c) {
return new DeckflowController($c['AppName'], $c);
});
// Migration ausführen
\OC::$server->getMigrationService()->registerMigration(Version20250312000000::class);
\OC::$server->getBackgroundJobManager()->add(new WorkflowJob());
}
}

4
assets/js/deckflow.js Normal file
View File

@ -0,0 +1,4 @@
// deckflow.js
document.addEventListener('DOMContentLoaded', function () {
// JS für das Bearbeiten oder Löschen von Workflows
});

View File

@ -1,22 +0,0 @@
{
"name": "deckflow/deckflow",
"description": "Automatische Workflows für Nextcloud Decks",
"type": "nextcloud-app",
"version": "1.0.0",
"license": "GPL-3.0",
"authors": [
{
"name": "Dein Name",
"email": "deine@email.de"
}
],
"require": {
"php": "^7.2",
"nextcloud/app-framework": "^1.0"
},
"autoload": {
"psr-4": {
"Deckflow\\": "src/"
}
}
}

View File

@ -0,0 +1,37 @@
<?php
namespace OCA\Deckflow\Controller;
use OCP\AppFramework\Controller;
use OCP\IRequest;
use OCA\Deckflow\WorkflowRepository;
use OCP\User\CurrentUser;
class DeckflowController extends Controller {
private $workflowRepo;
public function __construct($appName, IRequest $request) {
parent::__construct($appName, $request);
$this->workflowRepo = new WorkflowRepository();
}
// Zeigt alle Workflows des Benutzers an
public function getWorkflows() {
$user_id = \OC::$server->getUserManager()->getUser()->getUID();
$workflows = $this->workflowRepo->getWorkflowsForUser($user_id);
return $this->render('main.php', ['workflows' => $workflows]);
}
// Workflow erstellen
public function createWorkflow($deck_id, $source_stack_id, $target_stack_id) {
$user_id = \OC::$server->getUserManager()->getUser()->getUID();
$this->workflowRepo->createWorkflow($user_id, $deck_id, $source_stack_id, $target_stack_id);
return $this->getWorkflows();
}
// Workflow löschen
public function deleteWorkflow($workflow_id) {
$this->workflowRepo->deleteWorkflow($workflow_id);
return $this->getWorkflows();
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace OCA\Deckflow\Migrations;
use OCP\Migration\ITransaction;
use OCP\Migration\IOutput;
class Version20250312000000 implements ITransaction {
public function execute(IOutput $output) {
// Erstelle die Workflow-Tabelle
$output->output('Erstelle die deckflow_workflows-Tabelle...');
$query = 'CREATE TABLE IF NOT EXISTS `*deckflow_workflows` (
`id` INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
`user_id` VARCHAR(255) NOT NULL,
`deck_id` INT NOT NULL,
`source_stack_id` INT NOT NULL,
`target_stack_id` INT NOT NULL,
`created_at` DATETIME NOT NULL,
`last_run` DATETIME DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;';
\OC::$server->getDatabaseConnection()->executeQuery($query);
$output->output('Migration abgeschlossen.');
}
}

18
lib/WorkflowJob.php Normal file
View File

@ -0,0 +1,18 @@
<?php
namespace OCA\Deckflow;
use OC\BackgroundJob\TimedJob;
use OCP\BackgroundJob\IJob;
class WorkflowJob extends TimedJob {
public function run($argument) {
// Hole überfällige Workflows und verschiebe Karten
$workflowRepo = new WorkflowRepository();
$overdueWorkflows = $workflowRepo->getOverdueWorkflows();
foreach ($overdueWorkflows as $workflow) {
$workflowRepo->moveCardToTargetStack($workflow['card_id'], $workflow['target_stack_id']);
}
}
}

View File

@ -0,0 +1,42 @@
<?php
namespace OCA\Deckflow;
use OCP\DB\DbWrapper\SimpleDatabase;
use OCP\DB\DB;
class WorkflowRepository {
private $db;
public function __construct() {
$this->db = DB::getConnection();
}
// Alle Workflows eines Benutzers abrufen
public function getWorkflowsForUser($user_id) {
$query = 'SELECT * FROM *deckflow_workflows WHERE user_id = ?';
return $this->db->executeQuery($query, [$user_id])->fetchAll();
}
// Workflow erstellen
public function createWorkflow($user_id, $deck_id, $source_stack_id, $target_stack_id) {
$query = 'INSERT INTO *deckflow_workflows (user_id, deck_id, source_stack_id, target_stack_id, created_at) VALUES (?, ?, ?, ?, ?)';
$this->db->executeQuery($query, [$user_id, $deck_id, $source_stack_id, $target_stack_id, date('Y-m-d H:i:s')]);
}
// Workflow löschen
public function deleteWorkflow($workflow_id) {
$query = 'DELETE FROM *deckflow_workflows WHERE id = ?';
$this->db->executeQuery($query, [$workflow_id]);
}
// Workflows mit überfälligen Karten abrufen
public function getOverdueWorkflows() {
// Logik zum Abrufen überfälliger Karten
}
// Karte verschieben
public function moveCardToTargetStack($card_id, $target_stack_id) {
// Logik zum Verschieben von Karten
}
}

9
resources/css/style.css Normal file
View File

@ -0,0 +1,9 @@
/* style.css */
form {
margin: 20px 0;
}
button {
padding: 10px;
background-color: #007bff;
color: white;
}

View File

@ -1,22 +0,0 @@
<?php
namespace Deckflow\BackgroundJob;
use OCP\AppFramework\Utility\ITimeFactory;
use OCP\BackgroundJob\TimedJob;
class WorkflowJob extends TimedJob
{
private $workflowMapper;
public function __construct(ITimeFactory $timeFactory, WorkflowMapper $workflowMapper)
{
parent::__construct($timeFactory);
$this->workflowMapper = $workflowMapper;
}
protected function run($argument)
{
// Hier kommt die Logik für das Ausführen des Workflows hin
}
}

View File

@ -1,32 +0,0 @@
<?php
namespace Deckflow\Controller;
use OCP\IRequest;
use OCP\AppFramework\Controller;
use OCP\AppFramework\Http\TemplateResponse;
class DeckflowController extends Controller
{
private $request;
public function __construct(IRequest $request)
{
$this->request = $request;
}
public function index()
{
return new TemplateResponse('deckflow', 'index');
}
public function createWorkflow()
{
// Hier kommt die Logik für das Erstellen eines Workflows hin
}
public function editWorkflow()
{
// Hier kommt die Logik für das Bearbeiten eines Workflows hin
}
}

View File

@ -1,20 +0,0 @@
?php
namespace Deckflow\Db;
use OCP\AppFramework\Db\Mapper;
use Deckflow\Model\Workflow;
class WorkflowMapper extends Mapper
{
public function __construct(\OCP\IDBConnection $db)
{
parent::__construct($db, 'deckflow_workflows', Workflow::class);
}
public function findWorkflowsByUserId($userId)
{
$sql = 'SELECT * FROM deckflow_workflows WHERE user_id = ?';
return $this->findEntities($sql, [$userId]);
}
}

View File

@ -1,25 +0,0 @@
<?php
namespace Deckflow\Model;
use OCP\AppFramework\Db\Entity;
class Workflow extends Entity
{
protected $id;
protected $userId;
protected $deckId;
protected $sourceStackId;
protected $targetStackId;
protected $createdAt;
public function __construct()
{
$this->addType('id', 'integer');
$this->addType('userId', 'string');
$this->addType('deckId', 'integer');
$this->addType('sourceStackId', 'integer');
$this->addType('targetStackId', 'integer');
$this->addType('createdAt', 'timestamp');
}
}

40
templates/main.php Normal file
View File

@ -0,0 +1,40 @@
<?php
use OCP\AppFramework\Http\TemplateResponse;
$view = new TemplateResponse('deckflow', 'main');
$view->assign('workflows', $workflows);
echo $view->render();
?>
<!-- Workflow-Setup-Formular -->
<form action="/apps/deckflow/create" method="POST">
<label for="deck_id">Deck auswählen:</label>
<select name="deck_id" id="deck_id">
<!-- Decks des Benutzers -->
</select>
<label for="source_stack_id">Quellstapel auswählen:</label>
<select name="source_stack_id" id="source_stack_id">
<!-- Quellstapel des Decks -->
</select>
<label for="target_stack_id">Zielstapel auswählen:</label>
<select name="target_stack_id" id="target_stack_id">
<!-- Zielstapel des Decks -->
</select>
<button type="submit">Workflow erstellen</button>
</form>
<!-- Workflows anzeigen -->
<ul>
<?php foreach ($workflows as $workflow): ?>
<li>
Deck: <?php echo $workflow['deck_id']; ?>,
Quellstapel: <?php echo $workflow['source_stack_id']; ?>,
Zielstapel: <?php echo $workflow['target_stack_id']; ?>
<a href="/apps/deckflow/delete/<?php echo $workflow['id']; ?>">Löschen</a>
</li>
<?php endforeach; ?>
</ul>