issue: reuse function to create messages from reply widget
authorMischa POSLAWSKY <perl@shiar.org>
Tue, 28 Sep 2021 15:05:22 +0000 (17:05 +0200)
committerMischa POSLAWSKY <perl@shiar.org>
Tue, 28 Sep 2021 16:40:38 +0000 (18:40 +0200)
Move code to common upload include for shared validation and features.

database.inc.php
issue/index.html
issue/index.php
upload.inc.php
widget/reply.php

index 12a82eb59badad8092c2ed8af8e84307ff90d249..b2244b9b0d52db65c180051ec2c24d89edcb27d1 100644 (file)
@@ -42,7 +42,7 @@ class DB
                        foreach ($row as $col => $val) {
                                $cols[] = $this->_value($val, $params);
                        }
-                       $sql = sprintf('INSERT INTO %s (%s) VALUES (%s) RETURNING id',
+                       $sql = sprintf('INSERT INTO %s (%s) VALUES (%s) RETURNING *',
                                '"'.$table.'"',
                                implode(', ', array_keys($row)),
                                implode(', ', $cols)
index 3cea55dde6c30f7d47b2950bff6dba8d84a86a31..e8486ce7ecef9993f3d27271bcb980b0a7623380 100644 (file)
@@ -8,8 +8,8 @@
 <li><label for="subject">Onderwerp:</label>
        <input type="text" id="subject" name="subject" size="60" value="" />
 </li>
-<li><label for="body">Beschrijving:</label>
-       <textarea id="body" name="body" cols="60" rows="3"></textarea>
+<li><label for="reply">Beschrijving:</label>
+       <textarea id="reply" name="reply" cols="60" rows="3"></textarea>
 </li>
 </ul><p><input type="submit" value="Aanmaken" /></p>
 </ul></form>
index a4b131483522ea0f395a896fada6693b4f96e424..9a35df87f97546ae44a4007fef9888b55744d3b1 100644 (file)
@@ -59,14 +59,11 @@ if ($_POST and isset($_POST['subject'])) {
                if (!$row->id) {
                        throw new Exception('Issue niet goed opgeslagen.');
                }
-               $query = $Db->set('comments', [
-                       'page'    => "{$Page->handler}/{$row->id}",
-                       'raw'     => $_POST['body'],
-                       'message' => messagehtml($_POST['body']),
-                       'author'  => $User->login,
-               ]);
-               if (!$query->rowCount()) {
-                       throw new Exception('Issueinhoud niet opgeslagen.');
+               try {
+                       createcomment($_POST, $row);
+               }
+               catch (Exception $e) {
+                       throw new Exception("Issueinhoud niet opgeslagen: {$e->getMessage()}.");
                }
                $_POST = [];
 }
index e270b76328c97968149f1962f0488247d66378c4..d87fa2d8f4e3bbcb9d14de3debe11ef970eebe6f 100644 (file)
@@ -1,4 +1,10 @@
 <?php
+global $journalcol;
+$journalcol = [
+       'assign' => 'Toegewezen aan',
+       'subject' => 'Onderwerp',
+];
+
 function userupload($input, $target = NULL, $filename = NULL)
 {
        switch ($input['error']) {
@@ -67,3 +73,74 @@ function messagehtml($input)
        ];
        return preg_replace(array_keys($markup), array_values($markup), htmlspecialchars($input));
 }
+
+function createcomment($input, &$Issue = NULL)
+{
+       # insert user message as database issue/reply
+       global $User, $Db, $Page, $journalcol;
+
+       $reply = [];
+       if (isset($input['reply']) and $body = $input['reply']) {
+               $reply['raw'] = $body;
+               $reply['message'] = messagehtml($body);
+       }
+       if ($_FILES and !empty($_FILES['image'])) {
+               $target = 'data/upload';
+               if (!file_exists($target)) {
+                       throw new Exception("er is geen uploadmap aanwezig op $target");
+               }
+               $target .= '/' . $User->login;
+               if ($result = userupload($_FILES['image'], $target)) {
+                       $reply['raw'] .= "/$result";
+                       if (preg_match('(^image/)', $_FILES['image']['type'])) {
+                               $reply['message'] .= sprintf('<p><img src="/thumb/640x/%s" /></p>', $result);
+                       }
+                       else {
+                               $reply['message'] .= sprintf('<p>Bijgevoegd bestand: <a href="/%s" />%s</a></p>',
+                                       $result, basename($result)
+                               );
+                       }
+               }
+       }
+       $query = $Db->set('comments', $reply + [
+               'page'    => "{$Page->handler}/{$Issue->id}",
+               'author'  => $User->login,
+       ]);
+       if (!$query->rowCount()) {
+               throw new Exception('Fout bij opslaan');
+       }
+       $newcomment = $Db->dbh->lastInsertId('comments_id_seq');
+
+       if (isset($Issue)) {
+               $row = [];
+               foreach (array_keys($journalcol) as $col) {
+                       if (!isset($input[$col])) continue;
+                       $row[$col] = $input[$col] ?: NULL;
+               }
+               if (isset($input['status'])) {
+                       $reset = !empty($input['status']);
+                       if (isset($Issue->closed) !== $reset) {
+                               $row['closed'] = $reset ? ['now()'] : NULL;
+                       }
+               }
+               $derived = ['updated' => ['now()']];
+               $filter = ['id = ? RETURNING *', $Issue->id];
+               $subquery = $Db->set('issues', $row + $derived, $filter);
+
+               if ($updated = $subquery->fetch()) {
+                       foreach (array_keys($row) as $col) {
+                               if ($updated->$col === $Issue->$col) continue; # unaltered
+                               $Db->set('journal', [
+                                       'comment_id' => $newcomment,
+                                       'property'   => 'attr',
+                                       'col'        => $col,
+                                       'old_value'  => $Issue->$col,
+                                       'value'      => $updated->$col,
+                               ]);
+                       }
+                       $Issue = $updated;
+               }
+       }
+
+       return $newcomment;
+}
index 66e958746b6f71bb330b4165ff138446c6178021..b740c2a5276722aa8bba0f6482a263af65a7b272 100644 (file)
@@ -1,78 +1,11 @@
 <?php
 global $User, $Db, $Issue;
 require_once 'database.inc.php';
-
-$journalcol = [
-       'assign' => 'Toegewezen aan',
-       'subject' => 'Onderwerp',
-];
+require_once 'upload.inc.php';
 
 if ($_POST) {
-       require_once 'upload.inc.php';
        try {
-               $reply = [];
-               if (isset($_POST['reply']) and $body = $_POST['reply']) {
-                       $reply['raw'] = $body;
-                       $reply['message'] = messagehtml($body);
-               }
-               if ($_FILES and !empty($_FILES['image'])) {
-                       $target = 'data/upload';
-                       if (!file_exists($target)) {
-                               throw new Exception("er is geen uploadmap aanwezig op $target");
-                       }
-                       $target .= '/' . $User->login;
-                       if ($result = userupload($_FILES['image'], $target)) {
-                               $reply['raw'] .= "/$result";
-                               if (preg_match('(^image/)', $_FILES['image']['type'])) {
-                                       $reply['message'] .= sprintf('<p><img src="/thumb/640x/%s" /></p>', $result);
-                               }
-                               else {
-                                       $reply['message'] .= sprintf('<p>Bijgevoegd bestand: <a href="/%s" />%s</a></p>',
-                                               $result, basename($result)
-                                       );
-                               }
-                       }
-               }
-               $query = $Db->set('comments', $reply + [
-                       'page'    => $Page->link,
-                       'author'  => $User->login,
-               ]);
-               if (!$query->rowCount()) {
-                       throw new Exception('Fout bij opslaan');
-               }
-               $newcomment = $Db->dbh->lastInsertId('comments_id_seq');
-
-               if (isset($Issue)) {
-                       $row = [];
-                       foreach (array_keys($journalcol) as $col) {
-                               if (!isset($_POST[$col])) continue;
-                               $row[$col] = $_POST[$col] ?: NULL;
-                       }
-                       if (isset($_POST['status'])) {
-                               $reset = !empty($_POST['status']);
-                               if (isset($Issue->closed) !== $reset) {
-                                       $row['closed'] = $reset ? ['now()'] : NULL;
-                               }
-                       }
-                       $derived = ['updated' => ['now()']];
-                       $filter = ['id = ? RETURNING *', $Issue->id];
-                       $subquery = $Db->set('issues', $row + $derived, $filter);
-
-                       if ($updated = $subquery->fetch()) {
-                               foreach (array_keys($row) as $col) {
-                                       if ($updated->$col === $Issue->$col) continue; # unaltered
-                                       $Db->set('journal', [
-                                               'comment_id' => $newcomment,
-                                               'property'   => 'attr',
-                                               'col'        => $col,
-                                               'old_value'  => $Issue->$col,
-                                               'value'      => $updated->$col,
-                                       ]);
-                               }
-                               $Issue = $updated;
-                       }
-               }
-
+               $newcomment = createcomment($_POST, $Issue);
                $target = "/{$Page->link}/$newcomment#$newcomment";
                abort($target, ($Page->api ? 200 : 303) . ' reply success');
                $_POST['reply'] = NULL;