xref: /webtrees/app/Http/RequestHandlers/ReorderMediaAction.php (revision d0889c636ab33113e71c9804803ddb055453ed50)
15229eadeSGreg Roach<?php
25229eadeSGreg Roach
35229eadeSGreg Roach/**
45229eadeSGreg Roach * webtrees: online genealogy
589f7189bSGreg Roach * Copyright (C) 2021 webtrees development team
65229eadeSGreg Roach * This program is free software: you can redistribute it and/or modify
75229eadeSGreg Roach * it under the terms of the GNU General Public License as published by
85229eadeSGreg Roach * the Free Software Foundation, either version 3 of the License, or
95229eadeSGreg Roach * (at your option) any later version.
105229eadeSGreg Roach * This program is distributed in the hope that it will be useful,
115229eadeSGreg Roach * but WITHOUT ANY WARRANTY; without even the implied warranty of
125229eadeSGreg Roach * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
135229eadeSGreg Roach * GNU General Public License for more details.
145229eadeSGreg Roach * You should have received a copy of the GNU General Public License
1589f7189bSGreg Roach * along with this program. If not, see <https://www.gnu.org/licenses/>.
165229eadeSGreg Roach */
17fcfa147eSGreg Roach
185229eadeSGreg Roachdeclare(strict_types=1);
195229eadeSGreg Roach
205229eadeSGreg Roachnamespace Fisharebest\Webtrees\Http\RequestHandlers;
215229eadeSGreg Roach
225229eadeSGreg Roachuse Fisharebest\Webtrees\Auth;
236b9cb339SGreg Roachuse Fisharebest\Webtrees\Registry;
245229eadeSGreg Roachuse Fisharebest\Webtrees\Tree;
255229eadeSGreg Roachuse Psr\Http\Message\ResponseInterface;
265229eadeSGreg Roachuse Psr\Http\Message\ServerRequestInterface;
275229eadeSGreg Roachuse Psr\Http\Server\RequestHandlerInterface;
285229eadeSGreg Roach
295229eadeSGreg Roachuse function array_merge;
305229eadeSGreg Roachuse function array_search;
315229eadeSGreg Roachuse function assert;
325229eadeSGreg Roachuse function implode;
335229eadeSGreg Roachuse function is_array;
345229eadeSGreg Roachuse function is_string;
355229eadeSGreg Roachuse function redirect;
365229eadeSGreg Roachuse function uksort;
375229eadeSGreg Roach
385229eadeSGreg Roach/**
395229eadeSGreg Roach * Reorder the media of an individual.
405229eadeSGreg Roach */
415229eadeSGreg Roachclass ReorderMediaAction implements RequestHandlerInterface
425229eadeSGreg Roach{
435229eadeSGreg Roach    /**
445229eadeSGreg Roach     * @param ServerRequestInterface $request
455229eadeSGreg Roach     *
465229eadeSGreg Roach     * @return ResponseInterface
475229eadeSGreg Roach     */
485229eadeSGreg Roach    public function handle(ServerRequestInterface $request): ResponseInterface
495229eadeSGreg Roach    {
505229eadeSGreg Roach        $tree = $request->getAttribute('tree');
5175964c75SGreg Roach        assert($tree instanceof Tree);
525229eadeSGreg Roach
53745148ddSGreg Roach        $xref = $request->getAttribute('xref');
5475964c75SGreg Roach        assert(is_string($xref));
555229eadeSGreg Roach
566b9cb339SGreg Roach        $individual = Registry::individualFactory()->make($xref, $tree);
57ddeb3354SGreg Roach        $individual = Auth::checkIndividualAccess($individual, true);
585229eadeSGreg Roach
59b46c87bdSGreg Roach        $params = (array) $request->getParsedBody();
60b46c87bdSGreg Roach
61b46c87bdSGreg Roach        $order = $params['order'];
6275964c75SGreg Roach        assert(is_array($order));
635229eadeSGreg Roach
641f244d77SGreg Roach        $fake_facts = ['0 @' . $individual->xref() . '@ INDI'];
655229eadeSGreg Roach        $sort_facts = [];
665229eadeSGreg Roach        $keep_facts = [];
675229eadeSGreg Roach
685229eadeSGreg Roach        // Split facts into OBJE and other
695229eadeSGreg Roach        foreach ($individual->facts() as $fact) {
70*d0889c63SGreg Roach            if ($fact->tag() === 'INDI:OBJE') {
715229eadeSGreg Roach                $sort_facts[$fact->id()] = $fact->gedcom();
725229eadeSGreg Roach            } else {
735229eadeSGreg Roach                $keep_facts[] = $fact->gedcom();
745229eadeSGreg Roach            }
755229eadeSGreg Roach        }
765229eadeSGreg Roach
775229eadeSGreg Roach        // Sort the facts
785229eadeSGreg Roach        uksort($sort_facts, static function ($x, $y) use ($order) {
7998a409edSGreg Roach            return array_search($x, $order, true) <=> array_search($y, $order, true);
805229eadeSGreg Roach        });
815229eadeSGreg Roach
825229eadeSGreg Roach        // Merge the facts
831f244d77SGreg Roach        $gedcom = implode("\n", array_merge($fake_facts, $sort_facts, $keep_facts));
845229eadeSGreg Roach
855229eadeSGreg Roach        $individual->updateRecord($gedcom, false);
865229eadeSGreg Roach
875229eadeSGreg Roach        return redirect($individual->url());
885229eadeSGreg Roach    }
895229eadeSGreg Roach}
90