2 # @description: WebDAV-Migration für Mandanten
5 package SL::DBUpgrade2::clients_webdav;
10 use parent qw(SL::DBUpgrade2::Base);
12 use File::Path qw(make_path);
14 use List::MoreUtils qw(any all);
15 use List::Util qw(first);
20 use SL::Helper::Flash;
22 use Rose::Object::MakeMethods::Generic (
23 'scalar --get_set_init' => [ qw(clients old_folders) ],
28 return [ selectall_hashref_query($::form, $self->dbh, qq|SELECT * FROM auth.clients ORDER BY lower(name)|) ];
31 sub init_old_folders {
32 tie my %dir, 'IO::Dir', 'webdav';
33 return [ sort grep { -d } keys %dir ];
36 sub _unlink_old_folders {
37 my ($self, %params) = @_;
39 rmdir $_ for @{ $self->old_folders };
44 sub _ensure_one_client_exists {
45 my ($self, %params) = @_;
47 return if 0 != scalar @{ $self->clients };
50 INSERT INTO auth.clients (name, dbhost, dbport, dbname, dbuser, dbpasswd, is_default)
51 VALUES (?, ?, 5432, ?, ?, ?, true)
54 $self->dbh->do($sql, undef, $::locale->text('Default Client (unconfigured)'), ($::locale->text('unconfigured')) x 4);
56 undef $self->{clients};
59 sub _move_files_into {
60 my ($self, $client) = @_;
62 tie my %dir, 'IO::Dir', 'webdav';
63 my @entries = grep { !m/^\.\.?$/ } keys %dir;
65 make_path('webdav/' . $client->{id});
66 rename "webdav/$_", "webdav/" . $client->{id} . "/$_" for @entries;
70 my ($self, $client) = @_;
71 make_path('webdav/' . $client->{id} . "/$_") for qw(angebote bestellungen anfragen lieferantenbestellungen verkaufslieferscheine einkaufslieferscheine gutschriften rechnungen einkaufsrechnungen);
75 my ($self, $client) = @_;
77 my $name = $client->{name} // '';
80 make_path('webdav/links');
81 symlink '../' . $client->{id}, "webdav/links/${name}";
87 # WebDAV not activated? Remove old folders, and we're done.
88 return $self->_unlink_old_folders if !$::lx_office_conf{features}->{webdav};
90 # Ensure at least one client exists.
91 $self->_ensure_one_client_exists;
94 if (1 == scalar @{ $self->clients }) {
95 # Exactly one client? Great, use that one without bothering the
97 $client_to_use = $self->clients->[0];
100 # If there's more than one client then let the user select which
101 # client to move the old files into. Maybe she already did?
102 $client_to_use = first { $_->{id} == $::form->{client_id} } @{ $self->clients } if $::form->{client_id};
104 if (!$client_to_use) {
105 # Nope, let's select it.
106 print $::form->parse_html_template('dbupgrade/auth/clients_webdav', { SELF => $self, default_client => (first { $_->{is_default} } @{ $self->clients }) });
111 # Move files for the selected client.
112 $self->_move_files_into($client_to_use);
114 # Create the directory structures for all (even the selected client
115 # -- folders might be missing).
116 for (@{ $self->clients }) {
117 $self->_create_folders($_);
118 $self->_create_symlink($_);