View | Details | Raw Unified | Return to bug 39190
Collapse All | Expand All

(-)a/Koha/File/Transport.pm (-1 / +1 lines)
Lines 142-148 on the API. Link Here
142
=cut
142
=cut
143
143
144
sub to_api_mapping {
144
sub to_api_mapping {
145
    return { id => 'sftp_server_id' };
145
    return { id => 'file_transport_id' };
146
}
146
}
147
147
148
=head3 test_connection
148
=head3 test_connection
(-)a/Koha/REST/V1/Config/SFTP/Servers.pm (-22 / +22 lines)
Lines 1-4 Link Here
1
package Koha::REST::V1::Config::SFTP::Servers;
1
package Koha::REST::V1::Config::File::Transports;
2
2
3
# This file is part of Koha.
3
# This file is part of Koha.
4
#
4
#
Lines 37-47 sub list { Link Here
37
    my $c = shift->openapi->valid_input or return;
37
    my $c = shift->openapi->valid_input or return;
38
38
39
    return try {
39
    return try {
40
        my $sftp_servers_set = Koha::File::Transports->new;
40
        my $file_transports_set = Koha::File::Transports->new;
41
        my $sftp_servers     = $c->objects->search($sftp_servers_set);
41
        my $file_transports     = $c->objects->search($file_transports_set);
42
        return $c->render(
42
        return $c->render(
43
            status  => 200,
43
            status  => 200,
44
            openapi => $sftp_servers
44
            openapi => $file_transports
45
        );
45
        );
46
    } catch {
46
    } catch {
47
        $c->unhandled_exception($_);
47
        $c->unhandled_exception($_);
Lines 58-71 sub get { Link Here
58
    my $c = shift->openapi->valid_input or return;
58
    my $c = shift->openapi->valid_input or return;
59
59
60
    return try {
60
    return try {
61
        my $sftp_server = Koha::File::Transports->find( $c->param('sftp_server_id') );
61
        my $file_transport = Koha::File::Transports->find( $c->param('file_transport_id') );
62
62
63
        return $c->render_resource_not_found("FTP/SFTP server")
63
        return $c->render_resource_not_found("File transport")
64
            unless $sftp_server;
64
            unless $file_transport;
65
65
66
        return $c->render(
66
        return $c->render(
67
            status  => 200,
67
            status  => 200,
68
            openapi => $c->objects->to_api($sftp_server),
68
            openapi => $c->objects->to_api($file_transport),
69
        );
69
        );
70
    } catch {
70
    } catch {
71
        $c->unhandled_exception($_);
71
        $c->unhandled_exception($_);
Lines 83-96 sub add { Link Here
83
83
84
    return try {
84
    return try {
85
85
86
        my $sftp_server = Koha::File::Transport->new_from_api( $c->req->json );
86
        my $file_transport = Koha::File::Transport->new_from_api( $c->req->json );
87
        $sftp_server->store->discard_changes;
87
        $file_transport->store->discard_changes;
88
88
89
        $c->res->headers->location( $c->req->url->to_string . '/' . $sftp_server->id );
89
        $c->res->headers->location( $c->req->url->to_string . '/' . $file_transport->id );
90
90
91
        return $c->render(
91
        return $c->render(
92
            status  => 201,
92
            status  => 201,
93
            openapi => $c->objects->to_api($sftp_server),
93
            openapi => $c->objects->to_api($file_transport),
94
        );
94
        );
95
    } catch {
95
    } catch {
96
        if ( blessed $_ and $_->isa('Koha::Exceptions::Object::DuplicateID') ) {
96
        if ( blessed $_ and $_->isa('Koha::Exceptions::Object::DuplicateID') ) {
Lines 116-133 Controller method that handles updating a Koha::File::Transport object Link Here
116
sub update {
116
sub update {
117
    my $c = shift->openapi->valid_input or return;
117
    my $c = shift->openapi->valid_input or return;
118
118
119
    my $sftp_server = Koha::File::Transports->find( $c->param('sftp_server_id') );
119
    my $file_transport = Koha::File::Transports->find( $c->param('file_transport_id') );
120
120
121
    return $c->render_resource_not_found("FTP/SFTP server")
121
    return $c->render_resource_not_found("File transport")
122
        unless $sftp_server;
122
        unless $file_transport;
123
123
124
    return try {
124
    return try {
125
        $sftp_server->set_from_api( $c->req->json );
125
        $file_transport->set_from_api( $c->req->json );
126
        $sftp_server->store->discard_changes;
126
        $file_transport->store->discard_changes;
127
127
128
        return $c->render(
128
        return $c->render(
129
            status  => 200,
129
            status  => 200,
130
            openapi => $c->objects->to_api($sftp_server),
130
            openapi => $c->objects->to_api($file_transport),
131
        );
131
        );
132
    } catch {
132
    } catch {
133
        if ( blessed $_ and $_->isa('Koha::Exceptions::Object::DuplicateID') ) {
133
        if ( blessed $_ and $_->isa('Koha::Exceptions::Object::DuplicateID') ) {
Lines 153-165 Controller method that handles deleting a Koha::File::Transport object Link Here
153
sub delete {
153
sub delete {
154
    my $c = shift->openapi->valid_input or return;
154
    my $c = shift->openapi->valid_input or return;
155
155
156
    my $sftp_server = Koha::File::Transports->find( $c->param('sftp_server_id') );
156
    my $file_transport = Koha::File::Transports->find( $c->param('file_transport_id') );
157
157
158
    return $c->render_resource_not_found("FTP/SFTP server")
158
    return $c->render_resource_not_found("File transport")
159
        unless $sftp_server;
159
        unless $file_transport;
160
160
161
    return try {
161
    return try {
162
        $sftp_server->delete;
162
        $file_transport->delete;
163
        return $c->render_resource_deleted;
163
        return $c->render_resource_deleted;
164
    } catch {
164
    } catch {
165
        $c->unhandled_exception($_);
165
        $c->unhandled_exception($_);
(-)a/api/v1/swagger/definitions/sftp_server.yaml (-5 / +5 lines)
Lines 1-13 Link Here
1
---
1
---
2
type: object
2
type: object
3
properties:
3
properties:
4
  sftp_server_id:
4
  file_transport_id:
5
    type: integer
5
    type: integer
6
    description: Internal FTP/SFTP server identifier
6
    description: Internal File transport identifier
7
    readOnly: true
7
    readOnly: true
8
  name:
8
  name:
9
    type: string
9
    type: string
10
    description: Name of the FTP/SFTP server
10
    description: Name of the File transport
11
  host:
11
  host:
12
    type: string
12
    type: string
13
    description: FTP/SFTP host name (optional)
13
    description: FTP/SFTP host name (optional)
Lines 20-26 properties: Link Here
20
      - ftp
20
      - ftp
21
      - sftp
21
      - sftp
22
      - file
22
      - file
23
    description: Transport of FTP/SFTP server (optional)
23
    description: Transport of File transport (optional)
24
  auth_mode:
24
  auth_mode:
25
    type: string
25
    type: string
26
    enum:
26
    enum:
Lines 60-66 properties: Link Here
60
    type:
60
    type:
61
      - object
61
      - object
62
      - "null"
62
      - "null"
63
    description: Most recent status of the FTP/SFTP server (optional)
63
    description: Most recent status of the File transport (optional)
64
  debug:
64
  debug:
65
    type: boolean
65
    type: boolean
66
    description: If the SMTP connection is set to debug mode (optional)
66
    description: If the SMTP connection is set to debug mode (optional)
(-)a/api/v1/swagger/paths/config_sftp_servers.yaml (-38 / +38 lines)
Lines 1-11 Link Here
1
---
1
---
2
/config/sftp_servers:
2
/config/file_transports:
3
  get:
3
  get:
4
    x-mojo-to: Config::SFTP::Servers#list
4
    x-mojo-to: Config::File::Transports#list
5
    operationId: listSFTPServers
5
    operationId: listFileTransportServers
6
    tags:
6
    tags:
7
      - sftp_servers
7
      - file_transports
8
    summary: List FTP/SFTP servers
8
    summary: List File transports
9
    produces:
9
    produces:
10
      - application/json
10
      - application/json
11
    parameters:
11
    parameters:
Lines 18-28 Link Here
18
      - $ref: "../swagger.yaml#/parameters/request_id_header"
18
      - $ref: "../swagger.yaml#/parameters/request_id_header"
19
    responses:
19
    responses:
20
      "200":
20
      "200":
21
        description: A list of FTP/SFTP servers
21
        description: A list of File transports
22
        schema:
22
        schema:
23
          type: array
23
          type: array
24
          items:
24
          items:
25
            $ref: "../swagger.yaml#/definitions/sftp_server"
25
            $ref: "../swagger.yaml#/definitions/file_transport"
26
      "400":
26
      "400":
27
        description: |
27
        description: |
28
          Bad request. Possible `error_code` attribute values:
28
          Bad request. Possible `error_code` attribute values:
Lines 49-73 Link Here
49
      permissions:
49
      permissions:
50
        parameters: manage_file_transports
50
        parameters: manage_file_transports
51
  post:
51
  post:
52
    x-mojo-to: Config::SFTP::Servers#add
52
    x-mojo-to: Config::File::Transports#add
53
    operationId: addSFTPServer
53
    operationId: addFileTransportServer
54
    tags:
54
    tags:
55
      - sftp_servers
55
      - file_transports
56
    summary: Add FTP/SFTP server
56
    summary: Add File transport
57
    parameters:
57
    parameters:
58
      - name: body
58
      - name: body
59
        in: body
59
        in: body
60
        description: A JSON object representing a new FTP/SFTP server configuration
60
        description: A JSON object representing a new File transport configuration
61
        required: true
61
        required: true
62
        schema:
62
        schema:
63
          $ref: "../swagger.yaml#/definitions/sftp_server"
63
          $ref: "../swagger.yaml#/definitions/file_transport"
64
    produces:
64
    produces:
65
      - application/json
65
      - application/json
66
    responses:
66
    responses:
67
      "201":
67
      "201":
68
        description: An FTP/SFTP server object
68
        description: An File transport object
69
        schema:
69
        schema:
70
          $ref: "../swagger.yaml#/definitions/sftp_server"
70
          $ref: "../swagger.yaml#/definitions/file_transport"
71
      "400":
71
      "400":
72
        description: Bad request
72
        description: Bad request
73
        schema:
73
        schema:
Lines 98-119 Link Here
98
    x-koha-authorization:
98
    x-koha-authorization:
99
      permissions:
99
      permissions:
100
        parameters: manage_file_transports
100
        parameters: manage_file_transports
101
"/config/sftp_servers/{sftp_server_id}":
101
"/config/file_transports/{file_transport_id}":
102
  get:
102
  get:
103
    x-mojo-to: Config::SFTP::Servers#get
103
    x-mojo-to: Config::File::Transports#get
104
    operationId: getSFTPServer
104
    operationId: getFileTransportServer
105
    tags:
105
    tags:
106
      - sftp_servers
106
      - file_transports
107
    summary: Get FTP/SFTP server
107
    summary: Get File transport
108
    parameters:
108
    parameters:
109
      - $ref: "../swagger.yaml#/parameters/sftp_server_id_pp"
109
      - $ref: "../swagger.yaml#/parameters/file_transport_id_pp"
110
    produces:
110
    produces:
111
      - application/json
111
      - application/json
112
    responses:
112
    responses:
113
      "200":
113
      "200":
114
        description: An FTP/SFTP server object
114
        description: An File transport object
115
        schema:
115
        schema:
116
          $ref: "../swagger.yaml#/definitions/sftp_server"
116
          $ref: "../swagger.yaml#/definitions/file_transport"
117
      "400":
117
      "400":
118
        description: Bad request
118
        description: Bad request
119
        schema:
119
        schema:
Lines 141-166 Link Here
141
      permissions:
141
      permissions:
142
        parameters: manage_file_transports
142
        parameters: manage_file_transports
143
  put:
143
  put:
144
    x-mojo-to: Config::SFTP::Servers#update
144
    x-mojo-to: Config::File::Transports#update
145
    operationId: updateSFTPServer
145
    operationId: updateFileTransportServer
146
    tags:
146
    tags:
147
      - sftp_servers
147
      - file_transports
148
    summary: Update FTP/SFTP server
148
    summary: Update File transport
149
    parameters:
149
    parameters:
150
      - $ref: "../swagger.yaml#/parameters/sftp_server_id_pp"
150
      - $ref: "../swagger.yaml#/parameters/file_transport_id_pp"
151
      - name: body
151
      - name: body
152
        in: body
152
        in: body
153
        description: An FTP/SFTP server object
153
        description: An File transport object
154
        required: true
154
        required: true
155
        schema:
155
        schema:
156
          $ref: "../swagger.yaml#/definitions/sftp_server"
156
          $ref: "../swagger.yaml#/definitions/file_transport"
157
    produces:
157
    produces:
158
      - application/json
158
      - application/json
159
    responses:
159
    responses:
160
      "200":
160
      "200":
161
        description: An FTP/SFTP server object
161
        description: An File transport object
162
        schema:
162
        schema:
163
          $ref: "../swagger.yaml#/definitions/sftp_server"
163
          $ref: "../swagger.yaml#/definitions/file_transport"
164
      "400":
164
      "400":
165
        description: Bad request
165
        description: Bad request
166
        schema:
166
        schema:
Lines 192-209 Link Here
192
      permissions:
192
      permissions:
193
        parameters: manage_file_transports
193
        parameters: manage_file_transports
194
  delete:
194
  delete:
195
    x-mojo-to: Config::SFTP::Servers#delete
195
    x-mojo-to: Config::File::Transports#delete
196
    operationId: deleteSFTPServer
196
    operationId: deleteFileTransportServer
197
    tags:
197
    tags:
198
      - sftp_servers
198
      - file_transports
199
    summary: Delete FTP/SFTP server
199
    summary: Delete File transport
200
    parameters:
200
    parameters:
201
      - $ref: "../swagger.yaml#/parameters/sftp_server_id_pp"
201
      - $ref: "../swagger.yaml#/parameters/file_transport_id_pp"
202
    produces:
202
    produces:
203
      - application/json
203
      - application/json
204
    responses:
204
    responses:
205
      "204":
205
      "204":
206
        description: FTP/SFTP server deleted
206
        description: File transport deleted
207
      "400":
207
      "400":
208
        description: Bad request
208
        description: Bad request
209
        schema:
209
        schema:
(-)a/api/v1/swagger/swagger.yaml (-12 / +12 lines)
Lines 178-185 definitions: Link Here
178
    $ref: ./definitions/search_filter.yaml
178
    $ref: ./definitions/search_filter.yaml
179
  smtp_server:
179
  smtp_server:
180
    $ref: ./definitions/smtp_server.yaml
180
    $ref: ./definitions/smtp_server.yaml
181
  sftp_server:
181
  file_transport:
182
    $ref: ./definitions/sftp_server.yaml
182
    $ref: ./definitions/file_transport.yaml
183
  suggestion:
183
  suggestion:
184
    $ref: ./definitions/suggestion.yaml
184
    $ref: ./definitions/suggestion.yaml
185
  ticket:
185
  ticket:
Lines 321-330 paths: Link Here
321
    $ref: ./paths/config_smtp_servers.yaml#/~1config~1smtp_servers
321
    $ref: ./paths/config_smtp_servers.yaml#/~1config~1smtp_servers
322
  "/config/smtp_servers/{smtp_server_id}":
322
  "/config/smtp_servers/{smtp_server_id}":
323
    $ref: "./paths/config_smtp_servers.yaml#/~1config~1smtp_servers~1{smtp_server_id}"
323
    $ref: "./paths/config_smtp_servers.yaml#/~1config~1smtp_servers~1{smtp_server_id}"
324
  /config/sftp_servers:
324
  /config/file_transports:
325
    $ref: ./paths/config_sftp_servers.yaml#/~1config~1sftp_servers
325
    $ref: ./paths/config_file_transports.yaml#/~1config~1file_transports
326
  "/config/sftp_servers/{sftp_server_id}":
326
  "/config/file_transports/{file_transport_id}":
327
    $ref: "./paths/config_sftp_servers.yaml#/~1config~1sftp_servers~1{sftp_server_id}"
327
    $ref: "./paths/config_file_transports.yaml#/~1config~1file_transports~1{file_transport_id}"
328
  "/deleted/biblios":
328
  "/deleted/biblios":
329
    $ref: "./paths/deleted_biblios.yaml#/~1deleted~1biblios"
329
    $ref: "./paths/deleted_biblios.yaml#/~1deleted~1biblios"
330
  "/deleted/biblios/{biblio_id}":
330
  "/deleted/biblios/{biblio_id}":
Lines 961-970 parameters: Link Here
961
    name: smtp_server_id
961
    name: smtp_server_id
962
    required: true
962
    required: true
963
    type: integer
963
    type: integer
964
  sftp_server_id_pp:
964
  file_transport_id_pp:
965
    description: FTP/SFTP server internal identifier
965
    description: File transport internal identifier
966
    in: path
966
    in: path
967
    name: sftp_server_id
967
    name: file_transport_id
968
    required: true
968
    required: true
969
    type: integer
969
    type: integer
970
  suggestion_id_pp:
970
  suggestion_id_pp:
Lines 1317-1325 tags: Link Here
1317
  - description: "Manage SMTP servers configurations\n"
1317
  - description: "Manage SMTP servers configurations\n"
1318
    name: smtp_servers
1318
    name: smtp_servers
1319
    x-displayName: SMTP servers
1319
    x-displayName: SMTP servers
1320
  - description: "Manage FTP/SFTP servers configurations\n"
1320
  - description: "Manage file transport configurations\n"
1321
    name: sftp_servers
1321
    name: file_transports
1322
    x-displayName: FTP/SFTP servers
1322
    x-displayName: File transports
1323
  - description: "Manage tickets\n"
1323
  - description: "Manage tickets\n"
1324
    name: tickets
1324
    name: tickets
1325
    x-displayName: Tickets
1325
    x-displayName: Tickets
(-)a/koha-tmpl/intranet-tmpl/prog/en/modules/admin/file_transports.tt (-13 / +13 lines)
Lines 274-280 Link Here
274
                    <form action="/cgi-bin/koha/admin/file_transports.pl" id="edit_save" name="edit_save" class="validated" method="post">
274
                    <form action="/cgi-bin/koha/admin/file_transports.pl" id="edit_save" name="edit_save" class="validated" method="post">
275
                        [% INCLUDE 'csrf-token.inc' %]
275
                        [% INCLUDE 'csrf-token.inc' %]
276
                        <input type="hidden" name="op" value="cud-edit_save" />
276
                        <input type="hidden" name="op" value="cud-edit_save" />
277
                        <input type="hidden" name="sftp_server_id" value="[%- sftp_server.id | html -%]" />
277
                        <input type="hidden" name="file_transport_id" value="[%- sftp_server.id | html -%]" />
278
                        <fieldset class="rows">
278
                        <fieldset class="rows">
279
                            <ol>
279
                            <ol>
280
                                <li>
280
                                <li>
Lines 415-421 Link Here
415
                        </div>
415
                        </div>
416
                    [% ELSE %]
416
                    [% ELSE %]
417
                        <div class="page-section">
417
                        <div class="page-section">
418
                            <table id="sftp_servers">
418
                            <table id="file_transports">
419
                                <thead>
419
                                <thead>
420
                                    <tr>
420
                                    <tr>
421
                                        <th>Name</th>
421
                                        <th>Name</th>
Lines 475-484 Link Here
475
        <script>
475
        <script>
476
            $(document).ready(function() {
476
            $(document).ready(function() {
477
477
478
                var sftp_servers_url = '/api/v1/config/sftp_servers';
478
                var file_transports_url = '/api/v1/config/file_transports';
479
                window.sftp_servers = $("#sftp_servers").kohaTable({
479
                window.file_transports = $("#file_transports").kohaTable({
480
                    "ajax": {
480
                    "ajax": {
481
                        "url": sftp_servers_url
481
                        "url": file_transports_url
482
                    },
482
                    },
483
                    "language": {
483
                    "language": {
484
                        "emptyTable": "<div class=\"alert alert-info\">"+_("There are no file transports defined.")+"</div>"
484
                        "emptyTable": "<div class=\"alert alert-info\">"+_("There are no file transports defined.")+"</div>"
Lines 617-624 Link Here
617
                        },
617
                        },
618
                        {
618
                        {
619
                            "data": function(row, type, val, meta) {
619
                            "data": function(row, type, val, meta) {
620
                                let result = '<a class="btn btn-default btn-xs" role="button" href="/cgi-bin/koha/admin/file_transports.pl?op=edit_form&amp;sftp_server_id='+ encodeURIComponent(row.sftp_server_id) +'"><i class="fa-solid fa-pencil" aria-hidden="true"></i> '+_("Edit")+'</a>'+"\n";
620
                                let result = '<a class="btn btn-default btn-xs" role="button" href="/cgi-bin/koha/admin/file_transports.pl?op=edit_form&amp;file_transport_id='+ encodeURIComponent(row.file_transport_id) +'"><i class="fa-solid fa-pencil" aria-hidden="true"></i> '+_("Edit")+'</a>'+"\n";
621
                                result += '<a class="btn btn-default btn-xs delete_server" role="button" href="#" data-bs-toggle="modal" data-bs-target="#delete_confirm_modal" data-sftp-server-id="'+ encodeURIComponent(row.sftp_server_id) +'" data-sftp-server-name="'+ encodeURIComponent(row.name.escapeHtml()) +'"><i class="fa fa-trash-can" aria-hidden="true"></i> '+_("Delete")+'</a>';
621
                                result += '<a class="btn btn-default btn-xs delete_server" role="button" href="#" data-bs-toggle="modal" data-bs-target="#delete_confirm_modal" data-sftp-server-id="'+ encodeURIComponent(row.file_transport_id) +'" data-sftp-server-name="'+ encodeURIComponent(row.name.escapeHtml()) +'"><i class="fa fa-trash-can" aria-hidden="true"></i> '+_("Delete")+'</a>';
622
                                return result;
622
                                return result;
623
                            },
623
                            },
624
                            "searchable": false,
624
                            "searchable": false,
Lines 635-661 Link Here
635
                    },
635
                    },
636
                });
636
                });
637
637
638
                $('#sftp_servers').on("click", '.delete_server', function() {
638
                $('#file_transports').on("click", '.delete_server', function() {
639
                    var sftp_server_id   = $(this).data('sftp-server-id');
639
                    var file_transport_id   = $(this).data('sftp-server-id');
640
                    var sftp_server_name = decodeURIComponent($(this).data('sftp-server-name'));
640
                    var sftp_server_name = decodeURIComponent($(this).data('sftp-server-name'));
641
641
642
                    $("#delete_confirm_dialog").html(
642
                    $("#delete_confirm_dialog").html(
643
                        _("You are about to delete the '%s' file transport.").format(sftp_server_name)
643
                        _("You are about to delete the '%s' file transport.").format(sftp_server_name)
644
                    );
644
                    );
645
                    $("#delete_confirm_modal_button").data('sftp-server-id', sftp_server_id);
645
                    $("#delete_confirm_modal_button").data('sftp-server-id', file_transport_id);
646
                    $("#delete_confirm_modal_button").data('sftp-server-name', sftp_server_name);
646
                    $("#delete_confirm_modal_button").data('sftp-server-name', sftp_server_name);
647
                });
647
                });
648
648
649
                $("#delete_confirm_modal_button").on("click", function() {
649
                $("#delete_confirm_modal_button").on("click", function() {
650
650
651
                    var sftp_server_id   = $(this).data('sftp-server-id');
651
                    var file_transport_id   = $(this).data('sftp-server-id');
652
                    var sftp_server_name = $(this).data('sftp-server-name');
652
                    var sftp_server_name = $(this).data('sftp-server-name');
653
653
654
                    $.ajax({
654
                    $.ajax({
655
                        method: "DELETE",
655
                        method: "DELETE",
656
                        url: "/api/v1/config/sftp_servers/"+sftp_server_id
656
                        url: "/api/v1/config/file_transports/"+file_transport_id
657
                    }).success(function() {
657
                    }).success(function() {
658
                        window.sftp_servers.api().ajax.reload(function(data) {
658
                        window.file_transports.api().ajax.reload(function(data) {
659
                            $("#sftp_action_result_dialog").hide();
659
                            $("#sftp_action_result_dialog").hide();
660
                            $("#sftp_delete_success").html(_("Server '%s' deleted successfully.").format(sftp_server_name)).show();
660
                            $("#sftp_delete_success").html(_("Server '%s' deleted successfully.").format(sftp_server_name)).show();
661
                        });
661
                        });
(-)a/t/db_dependent/api/v1/sftp_servers.t (-66 / +62 lines)
Lines 61-70 subtest 'list() tests' => sub { Link Here
61
    my $unauth_userid = $patron->userid;
61
    my $unauth_userid = $patron->userid;
62
62
63
    ## Authorized user tests
63
    ## Authorized user tests
64
    # No FTP/SFTP servers, so empty array should be returned
64
    # No File transports, so empty array should be returned
65
    $t->get_ok("//$userid:$password@/api/v1/config/sftp_servers")->status_is(200)->json_is( [] );
65
    $t->get_ok("//$userid:$password@/api/v1/config/file_transports")->status_is(200)->json_is( [] );
66
66
67
    my $sftp_server = $builder->build_object(
67
    my $file_transport = $builder->build_object(
68
        {
68
        {
69
            class => 'Koha::File::Transports',
69
            class => 'Koha::File::Transports',
70
            value => {
70
            value => {
Lines 76-85 subtest 'list() tests' => sub { Link Here
76
        }
76
        }
77
    );
77
    );
78
78
79
    # One sftp server created, should get returned
79
    # One file transport created, should get returned
80
    $t->get_ok("//$userid:$password@/api/v1/config/sftp_servers")->status_is(200)->json_is( [ $sftp_server->to_api ] );
80
    $t->get_ok("//$userid:$password@/api/v1/config/file_transports")->status_is(200)
81
        ->json_is( [ $file_transport->to_api ] );
81
82
82
    my $another_sftp_server = $builder->build_object(
83
    my $another_file_transport = $builder->build_object(
83
        {
84
        {
84
            class => 'Koha::File::Transports',
85
            class => 'Koha::File::Transports',
85
            value => {
86
            value => {
Lines 91-102 subtest 'list() tests' => sub { Link Here
91
        }
92
        }
92
    );
93
    );
93
94
94
    # Two FTP/SFTP servers created, they should both be returned
95
    # Two File transports created, they should both be returned
95
    $t->get_ok("//$userid:$password@/api/v1/config/sftp_servers")->status_is(200)
96
    $t->get_ok("//$userid:$password@/api/v1/config/file_transports")->status_is(200)
96
        ->json_is( [ $sftp_server->to_api, $another_sftp_server->to_api, ] );
97
        ->json_is( [ $file_transport->to_api, $another_file_transport->to_api, ] );
97
98
98
    # Unauthorized access
99
    # Unauthorized access
99
    $t->get_ok("//$unauth_userid:$password@/api/v1/config/sftp_servers")->status_is(403);
100
    $t->get_ok("//$unauth_userid:$password@/api/v1/config/file_transports")->status_is(403);
100
101
101
    $schema->storage->txn_rollback;
102
    $schema->storage->txn_rollback;
102
};
103
};
Lines 107-113 subtest 'get() tests' => sub { Link Here
107
108
108
    $schema->storage->txn_begin;
109
    $schema->storage->txn_begin;
109
110
110
    my $sftp_server = $builder->build_object(
111
    my $file_transport = $builder->build_object(
111
        {
112
        {
112
            class => 'Koha::File::Transports',
113
            class => 'Koha::File::Transports',
113
            value => {
114
            value => {
Lines 138-149 subtest 'get() tests' => sub { Link Here
138
    $patron->set_password( { password => $password, skip_validation => 1 } );
139
    $patron->set_password( { password => $password, skip_validation => 1 } );
139
    my $unauth_userid = $patron->userid;
140
    my $unauth_userid = $patron->userid;
140
141
141
    $t->get_ok( "//$userid:$password@/api/v1/config/sftp_servers/" . $sftp_server->id )->status_is(200)
142
    $t->get_ok( "//$userid:$password@/api/v1/config/file_transports/" . $file_transport->id )->status_is(200)
142
        ->json_is( $sftp_server->to_api );
143
        ->json_is( $file_transport->to_api );
143
144
144
    $t->get_ok( "//$unauth_userid:$password@/api/v1/config/sftp_servers/" . $sftp_server->id )->status_is(403);
145
    $t->get_ok( "//$unauth_userid:$password@/api/v1/config/file_transports/" . $file_transport->id )->status_is(403);
145
146
146
    my $sftp_server_to_delete = $builder->build_object(
147
    my $file_transport_to_delete = $builder->build_object(
147
        {
148
        {
148
            class => 'Koha::File::Transports',
149
            class => 'Koha::File::Transports',
149
            value => {
150
            value => {
Lines 154-164 subtest 'get() tests' => sub { Link Here
154
            },
155
            },
155
        }
156
        }
156
    );
157
    );
157
    my $non_existent_id = $sftp_server_to_delete->id;
158
    my $non_existent_id = $file_transport_to_delete->id;
158
    $sftp_server_to_delete->delete;
159
    $file_transport_to_delete->delete;
159
160
160
    $t->get_ok("//$userid:$password@/api/v1/config/sftp_servers/$non_existent_id")->status_is(404)
161
    $t->get_ok("//$userid:$password@/api/v1/config/file_transports/$non_existent_id")->status_is(404)
161
        ->json_is( '/error' => 'FTP/SFTP server not found' );
162
        ->json_is( '/error' => 'File transport not found' );
162
163
163
    $schema->storage->txn_rollback;
164
    $schema->storage->txn_rollback;
164
};
165
};
Lines 191-197 subtest 'add() tests' => sub { Link Here
191
    $patron->set_password( { password => $password, skip_validation => 1 } );
192
    $patron->set_password( { password => $password, skip_validation => 1 } );
192
    my $unauth_userid = $patron->userid;
193
    my $unauth_userid = $patron->userid;
193
194
194
    my $sftp_server = $builder->build_object(
195
    my $file_transport = $builder->build_object(
195
        {
196
        {
196
            class => 'Koha::File::Transports',
197
            class => 'Koha::File::Transports',
197
            value => {
198
            value => {
Lines 202-222 subtest 'add() tests' => sub { Link Here
202
            },
203
            },
203
        }
204
        }
204
    );
205
    );
205
    my $sftp_server_data = $sftp_server->to_api;
206
    my $file_transport_data = $file_transport->to_api;
206
    delete $sftp_server_data->{sftp_server_id};
207
    delete $file_transport_data->{file_transport_id};
207
    $sftp_server->delete;
208
    $file_transport->delete;
208
209
209
    # Unauthorized attempt to write
210
    # Unauthorized attempt to write
210
    $t->post_ok( "//$unauth_userid:$password@/api/v1/config/sftp_servers" => json => $sftp_server_data )
211
    $t->post_ok( "//$unauth_userid:$password@/api/v1/config/file_transports" => json => $file_transport_data )
211
        ->status_is(403);
212
        ->status_is(403);
212
213
213
    # Authorized attempt to write invalid data
214
    # Authorized attempt to write invalid data
214
    my $sftp_server_with_invalid_field = {
215
    my $file_transport_with_invalid_field = {
215
        name => 'Some other server',
216
        name => 'Some other server',
216
        blah => 'blah'
217
        blah => 'blah'
217
    };
218
    };
218
219
219
    $t->post_ok( "//$userid:$password@/api/v1/config/sftp_servers" => json => $sftp_server_with_invalid_field )
220
    $t->post_ok( "//$userid:$password@/api/v1/config/file_transports" => json => $file_transport_with_invalid_field )
220
        ->status_is(400)->json_is(
221
        ->status_is(400)->json_is(
221
        "/errors" => [
222
        "/errors" => [
222
            {
223
            {
Lines 227-251 subtest 'add() tests' => sub { Link Here
227
        );
228
        );
228
229
229
    # Authorized attempt to write
230
    # Authorized attempt to write
230
    my $sftp_server_id =
231
    my $file_transport_id =
231
        $t->post_ok( "//$userid:$password@/api/v1/config/sftp_servers" => json => $sftp_server_data )
232
        $t->post_ok( "//$userid:$password@/api/v1/config/file_transports" => json => $file_transport_data )
232
        ->status_is( 201, 'SWAGGER3.2.1' )
233
        ->status_is( 201, 'SWAGGER3.2.1' )
233
        ->header_like( Location => qr|^\/api\/v1\/config\/sftp_servers\/\d*|, 'SWAGGER3.4.1' )
234
        ->header_like( Location => qr|^\/api\/v1\/config\/file_transports\/\d*|, 'SWAGGER3.4.1' )
234
        ->json_is( '/name' => $sftp_server_data->{name} )->tx->res->json->{sftp_server_id};
235
        ->json_is( '/name' => $file_transport_data->{name} )->tx->res->json->{file_transport_id};
235
236
236
    # Authorized attempt to create with null id
237
    # Authorized attempt to create with null id
237
    $sftp_server_data->{sftp_server_id} = undef;
238
    $file_transport_data->{file_transport_id} = undef;
238
    $t->post_ok( "//$userid:$password@/api/v1/config/sftp_servers" => json => $sftp_server_data )->status_is(400)
239
    $t->post_ok( "//$userid:$password@/api/v1/config/file_transports" => json => $file_transport_data )->status_is(400)
239
        ->json_has('/errors');
240
        ->json_has('/errors');
240
241
241
    # Authorized attempt to create with existing id
242
    # Authorized attempt to create with existing id
242
    $sftp_server_data->{sftp_server_id} = $sftp_server_id;
243
    $file_transport_data->{file_transport_id} = $file_transport_id;
243
    $t->post_ok( "//$userid:$password@/api/v1/config/sftp_servers" => json => $sftp_server_data )->status_is(400)
244
    $t->post_ok( "//$userid:$password@/api/v1/config/file_transports" => json => $file_transport_data )->status_is(400)
244
        ->json_is(
245
        ->json_is(
245
        "/errors" => [
246
        "/errors" => [
246
            {
247
            {
247
                message => "Read-only.",
248
                message => "Read-only.",
248
                path    => "/body/sftp_server_id"
249
                path    => "/body/file_transport_id"
249
            }
250
            }
250
        ]
251
        ]
251
        );
252
        );
Lines 279-285 subtest 'update() tests' => sub { Link Here
279
    $patron->set_password( { password => $password, skip_validation => 1 } );
280
    $patron->set_password( { password => $password, skip_validation => 1 } );
280
    my $unauth_userid = $patron->userid;
281
    my $unauth_userid = $patron->userid;
281
282
282
    my $sftp_server_id = $builder->build_object(
283
    my $file_transport_id = $builder->build_object(
283
        {
284
        {
284
            class => 'Koha::File::Transports',
285
            class => 'Koha::File::Transports',
285
            value => {
286
            value => {
Lines 292-338 subtest 'update() tests' => sub { Link Here
292
    )->id;
293
    )->id;
293
294
294
    # Unauthorized attempt to update
295
    # Unauthorized attempt to update
295
    $t->put_ok( "//$unauth_userid:$password@/api/v1/config/sftp_servers/$sftp_server_id" => json =>
296
    $t->put_ok( "//$unauth_userid:$password@/api/v1/config/file_transports/$file_transport_id" => json =>
296
            { name => 'New unauthorized name change' } )->status_is(403);
297
            { name => 'New unauthorized name change' } )->status_is(403);
297
298
298
    # Attempt partial update on a PUT
299
    # Attempt partial update on a PUT
299
    my $sftp_server_with_missing_field = {
300
    my $file_transport_with_missing_field = {
300
        host    => 'localhost',
301
        host    => 'localhost',
301
        passive => '1'
302
        passive => '1'
302
    };
303
    };
303
304
304
    $t->put_ok(
305
    $t->put_ok( "//$userid:$password@/api/v1/config/file_transports/$file_transport_id" => json =>
305
        "//$userid:$password@/api/v1/config/sftp_servers/$sftp_server_id" => json => $sftp_server_with_missing_field )
306
            $file_transport_with_missing_field )->status_is(400)
306
        ->status_is(400)->json_is( "/errors" => [ { message => "Missing property.", path => "/body/name" } ] );
307
        ->json_is( "/errors" => [ { message => "Missing property.", path => "/body/name" } ] );
307
308
308
    # Full object update on PUT
309
    # Full object update on PUT
309
    my $sftp_server_with_updated_field = {
310
    my $file_transport_with_updated_field = {
310
        name     => "Some name",
311
        name     => "Some name",
311
        password => "some_pass",
312
        password => "some_pass",
312
    };
313
    };
313
314
314
    $t->put_ok(
315
    $t->put_ok( "//$userid:$password@/api/v1/config/file_transports/$file_transport_id" => json =>
315
        "//$userid:$password@/api/v1/config/sftp_servers/$sftp_server_id" => json => $sftp_server_with_updated_field )
316
            $file_transport_with_updated_field )->status_is(200)->json_is( '/name' => 'Some name' );
316
        ->status_is(200)->json_is( '/name' => 'Some name' );
317
317
318
    # Authorized attempt to write invalid data
318
    # Authorized attempt to write invalid data
319
    my $sftp_server_with_invalid_field = {
319
    my $file_transport_with_invalid_field = {
320
        blah => "Blah",
320
        blah => "Blah",
321
        name => 'Some name'
321
        name => 'Some name'
322
    };
322
    };
323
323
324
    $t->put_ok(
324
    $t->put_ok( "//$userid:$password@/api/v1/config/file_transports/$file_transport_id" => json =>
325
        "//$userid:$password@/api/v1/config/sftp_servers/$sftp_server_id" => json => $sftp_server_with_invalid_field )
325
            $file_transport_with_invalid_field )->status_is(400)->json_is(
326
        ->status_is(400)->json_is(
327
        "/errors" => [
326
        "/errors" => [
328
            {
327
            {
329
                message => "Properties not allowed: blah.",
328
                message => "Properties not allowed: blah.",
330
                path    => "/body"
329
                path    => "/body"
331
            }
330
            }
332
        ]
331
        ]
333
        );
332
            );
334
333
335
    my $sftp_server_to_delete = $builder->build_object(
334
    my $file_transport_to_delete = $builder->build_object(
336
        {
335
        {
337
            class => 'Koha::File::Transports',
336
            class => 'Koha::File::Transports',
338
            value => {
337
            value => {
Lines 343-361 subtest 'update() tests' => sub { Link Here
343
            },
342
            },
344
        }
343
        }
345
    );
344
    );
346
    my $non_existent_id = $sftp_server_to_delete->id;
345
    my $non_existent_id = $file_transport_to_delete->id;
347
    $sftp_server_to_delete->delete;
346
    $file_transport_to_delete->delete;
348
347
349
    $t->put_ok(
348
    $t->put_ok( "//$userid:$password@/api/v1/config/file_transports/$non_existent_id" => json =>
350
        "//$userid:$password@/api/v1/config/sftp_servers/$non_existent_id" => json => $sftp_server_with_updated_field )
349
            $file_transport_with_updated_field )->status_is(404);
351
        ->status_is(404);
352
350
353
    # Wrong method (POST)
351
    # Wrong method (POST)
354
    $sftp_server_with_updated_field->{sftp_server_id} = 2;
352
    $file_transport_with_updated_field->{file_transport_id} = 2;
355
353
356
    $t->post_ok(
354
    $t->post_ok( "//$userid:$password@/api/v1/config/file_transports/$file_transport_id" => json =>
357
        "//$userid:$password@/api/v1/config/sftp_servers/$sftp_server_id" => json => $sftp_server_with_updated_field )
355
            $file_transport_with_updated_field )->status_is(404);
358
        ->status_is(404);
359
356
360
    $schema->storage->txn_rollback;
357
    $schema->storage->txn_rollback;
361
};
358
};
Lines 386-392 subtest 'delete() tests' => sub { Link Here
386
    $patron->set_password( { password => $password, skip_validation => 1 } );
383
    $patron->set_password( { password => $password, skip_validation => 1 } );
387
    my $unauth_userid = $patron->userid;
384
    my $unauth_userid = $patron->userid;
388
385
389
    my $sftp_server_id = $builder->build_object(
386
    my $file_transport_id = $builder->build_object(
390
        {
387
        {
391
            class => 'Koha::File::Transports',
388
            class => 'Koha::File::Transports',
392
            value => {
389
            value => {
Lines 399-410 subtest 'delete() tests' => sub { Link Here
399
    )->id;
396
    )->id;
400
397
401
    # Unauthorized attempt to delete
398
    # Unauthorized attempt to delete
402
    $t->delete_ok("//$unauth_userid:$password@/api/v1/config/sftp_servers/$sftp_server_id")->status_is(403);
399
    $t->delete_ok("//$unauth_userid:$password@/api/v1/config/file_transports/$file_transport_id")->status_is(403);
403
400
404
    $t->delete_ok("//$userid:$password@/api/v1/config/sftp_servers/$sftp_server_id")->status_is( 204, 'SWAGGER3.2.4' )
401
    $t->delete_ok("//$userid:$password@/api/v1/config/file_transports/$file_transport_id")
405
        ->content_is( '', 'SWAGGER3.3.4' );
402
        ->status_is( 204, 'SWAGGER3.2.4' )->content_is( '', 'SWAGGER3.3.4' );
406
403
407
    $t->delete_ok("//$userid:$password@/api/v1/config/sftp_servers/$sftp_server_id")->status_is(404);
404
    $t->delete_ok("//$userid:$password@/api/v1/config/file_transports/$file_transport_id")->status_is(404);
408
405
409
    $schema->storage->txn_rollback;
406
    $schema->storage->txn_rollback;
410
};
407
};
411
- 

Return to bug 39190