Bug 41107: Add /status/version API endpoint
Adds a new REST API endpoint to retrieve Koha version information.
This implementation includes:
- Koha::Status class for instance status information
- /status/version endpoint returning structured version data
- OpenAPI specification with koha_version definition
- REST controller for handling the endpoint
The returned version object includes:
- version: full version string (e.g., '25.06.00.029')
- major: major version number
- minor: minor version number
- release: major.minor version
- maintenance: major.minor.maintenance version
- development: development version (if applicable)
This prepares the foundation for a future /status endpoint that will
include all information displayed in the about page.
To test:
1. Apply the patch
2. Run:
$ ktd --shell
k$ yarn api:bundle
3. Run the tests:
k$ prove t/Koha/Status.t \
t/db_dependent/api/v1/status.t
=> SUCCESS: Tests pass!
4. Sign off :-D
Signed-off-by: David Nind <david@davidnind.com>
Signed-off-by: Kyle M Hall <kyle@bywatersolutions.com>
Signed-off-by: Martin Renvoize <martin.renvoize@openfifth.co.uk>
This commit is contained in:
parent
7929a1198e
commit
68c8b8f13f
|
|
@ -0,0 +1,56 @@
|
||||||
|
package Koha::REST::V1::Status;
|
||||||
|
|
||||||
|
# This file is part of Koha.
|
||||||
|
#
|
||||||
|
# Koha is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# Koha is distributed in the hope that it will be useful, but
|
||||||
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with Koha; if not, see <https://www.gnu.org/licenses>.
|
||||||
|
|
||||||
|
use Modern::Perl;
|
||||||
|
|
||||||
|
use Mojo::Base 'Mojolicious::Controller';
|
||||||
|
|
||||||
|
use Try::Tiny qw( catch try );
|
||||||
|
|
||||||
|
use Koha::Status;
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
Koha::REST::V1::Status - Controller library for status related API endpoints
|
||||||
|
|
||||||
|
=head1 API
|
||||||
|
|
||||||
|
=head2 Methods
|
||||||
|
|
||||||
|
=head3 version
|
||||||
|
|
||||||
|
Controller method that returns Koha version information
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub version {
|
||||||
|
my $c = shift->openapi->valid_input or return;
|
||||||
|
|
||||||
|
return try {
|
||||||
|
my $status = Koha::Status->new();
|
||||||
|
my $version_info = $status->version();
|
||||||
|
|
||||||
|
return $c->render(
|
||||||
|
status => 200,
|
||||||
|
openapi => $version_info
|
||||||
|
);
|
||||||
|
} catch {
|
||||||
|
$c->unhandled_exception($_);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
@ -0,0 +1,85 @@
|
||||||
|
package Koha::Status;
|
||||||
|
|
||||||
|
# This file is part of Koha.
|
||||||
|
#
|
||||||
|
# Koha is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# Koha is distributed in the hope that it will be useful, but
|
||||||
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with Koha; if not, see <https://www.gnu.org/licenses>.
|
||||||
|
|
||||||
|
use Modern::Perl;
|
||||||
|
|
||||||
|
use Koha;
|
||||||
|
|
||||||
|
=head1 NAME
|
||||||
|
|
||||||
|
Koha::Status - Koha instance status information
|
||||||
|
|
||||||
|
=head1 SYNOPSIS
|
||||||
|
|
||||||
|
use Koha::Status;
|
||||||
|
|
||||||
|
my $status = Koha::Status->new();
|
||||||
|
my $version_info = $status->version();
|
||||||
|
|
||||||
|
=head1 DESCRIPTION
|
||||||
|
|
||||||
|
This class provides methods to retrieve status information about the Koha instance.
|
||||||
|
|
||||||
|
=head1 METHODS
|
||||||
|
|
||||||
|
=head2 new
|
||||||
|
|
||||||
|
my $status = Koha::Status->new();
|
||||||
|
|
||||||
|
Constructor.
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub new {
|
||||||
|
my ($class) = @_;
|
||||||
|
return bless {}, $class;
|
||||||
|
}
|
||||||
|
|
||||||
|
=head2 version
|
||||||
|
|
||||||
|
my $version_info = $status->version();
|
||||||
|
|
||||||
|
Returns version information in a structured format similar to
|
||||||
|
Koha::Template::Plugin::Koha->Version but with additional metadata.
|
||||||
|
|
||||||
|
Returns a hashref with the following structure:
|
||||||
|
- version: full version string
|
||||||
|
- major: major version number
|
||||||
|
- minor: minor version number
|
||||||
|
- release: major.minor version
|
||||||
|
- maintenance: major.minor.maintenance version
|
||||||
|
- development: development version (if applicable)
|
||||||
|
|
||||||
|
=cut
|
||||||
|
|
||||||
|
sub version {
|
||||||
|
my ($self) = @_;
|
||||||
|
|
||||||
|
my $version_string = Koha::version();
|
||||||
|
my ( $major, $minor, $maintenance, $development ) = split( '\.', $version_string );
|
||||||
|
|
||||||
|
return {
|
||||||
|
version => $version_string,
|
||||||
|
major => $major,
|
||||||
|
minor => $minor,
|
||||||
|
release => $major . "." . $minor,
|
||||||
|
maintenance => $major . "." . $minor . "." . $maintenance,
|
||||||
|
development => ( $development && $development ne '000' ) ? $development : undef,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
1;
|
||||||
|
|
@ -0,0 +1,30 @@
|
||||||
|
---
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
version:
|
||||||
|
type: string
|
||||||
|
description: Full version string
|
||||||
|
example: "25.06.00.029"
|
||||||
|
major:
|
||||||
|
type: string
|
||||||
|
description: Major version number
|
||||||
|
example: "25"
|
||||||
|
minor:
|
||||||
|
type: string
|
||||||
|
description: Minor version number
|
||||||
|
example: "06"
|
||||||
|
release:
|
||||||
|
type: string
|
||||||
|
description: Release version (major.minor)
|
||||||
|
example: "25.06"
|
||||||
|
maintenance:
|
||||||
|
type: string
|
||||||
|
description: Maintenance version (major.minor.maintenance)
|
||||||
|
example: "25.06.00"
|
||||||
|
development:
|
||||||
|
type:
|
||||||
|
- string
|
||||||
|
- "null"
|
||||||
|
description: Development version number (null if not a development version)
|
||||||
|
example: "029"
|
||||||
|
additionalProperties: false
|
||||||
|
|
@ -0,0 +1,44 @@
|
||||||
|
---
|
||||||
|
"/status/version":
|
||||||
|
get:
|
||||||
|
x-mojo-to: Status#version
|
||||||
|
operationId: getStatusVersion
|
||||||
|
tags:
|
||||||
|
- status
|
||||||
|
summary: Get Koha version information
|
||||||
|
description: |
|
||||||
|
Returns version information for this Koha instance including major, minor,
|
||||||
|
maintenance and development version numbers.
|
||||||
|
produces:
|
||||||
|
- application/json
|
||||||
|
responses:
|
||||||
|
"200":
|
||||||
|
description: A suggestion
|
||||||
|
schema:
|
||||||
|
$ref: "../swagger.yaml#/definitions/koha_version"
|
||||||
|
"400":
|
||||||
|
description: Bad request
|
||||||
|
schema:
|
||||||
|
$ref: "../swagger.yaml#/definitions/error"
|
||||||
|
"403":
|
||||||
|
description: Access forbidden
|
||||||
|
schema:
|
||||||
|
$ref: "../swagger.yaml#/definitions/error"
|
||||||
|
"404":
|
||||||
|
description: Suggestion not found
|
||||||
|
schema:
|
||||||
|
$ref: "../swagger.yaml#/definitions/error"
|
||||||
|
"500":
|
||||||
|
description: |
|
||||||
|
Internal server error. Possible `error_code` attribute values:
|
||||||
|
|
||||||
|
* `internal_server_error`
|
||||||
|
schema:
|
||||||
|
$ref: "../swagger.yaml#/definitions/error"
|
||||||
|
"503":
|
||||||
|
description: Under maintenance
|
||||||
|
schema:
|
||||||
|
$ref: "../swagger.yaml#/definitions/error"
|
||||||
|
x-koha-authorization:
|
||||||
|
permissions:
|
||||||
|
catalogue: 1
|
||||||
|
|
@ -124,6 +124,8 @@ definitions:
|
||||||
$ref: ./definitions/import_batch_profiles.yaml
|
$ref: ./definitions/import_batch_profiles.yaml
|
||||||
import_record_match:
|
import_record_match:
|
||||||
$ref: ./definitions/import_record_match.yaml
|
$ref: ./definitions/import_record_match.yaml
|
||||||
|
koha_version:
|
||||||
|
$ref: definitions/koha_version.yaml
|
||||||
record_source:
|
record_source:
|
||||||
$ref: ./definitions/record_source.yaml
|
$ref: ./definitions/record_source.yaml
|
||||||
invoice:
|
invoice:
|
||||||
|
|
@ -637,6 +639,8 @@ paths:
|
||||||
$ref: ./paths/transfer_limits.yaml#/~1transfer_limits~1batch
|
$ref: ./paths/transfer_limits.yaml#/~1transfer_limits~1batch
|
||||||
"/transfer_limits/{limit_id}":
|
"/transfer_limits/{limit_id}":
|
||||||
$ref: "./paths/transfer_limits.yaml#/~1transfer_limits~1{limit_id}"
|
$ref: "./paths/transfer_limits.yaml#/~1transfer_limits~1{limit_id}"
|
||||||
|
/status/version:
|
||||||
|
$ref: ./paths/status.yaml#/~1status~1version
|
||||||
parameters:
|
parameters:
|
||||||
advancededitormacro_id_pp:
|
advancededitormacro_id_pp:
|
||||||
description: Advanced editor macro internal identifier
|
description: Advanced editor macro internal identifier
|
||||||
|
|
@ -1409,6 +1413,9 @@ tags:
|
||||||
- description: "Manage file transport configurations\n"
|
- description: "Manage file transport configurations\n"
|
||||||
name: file_transports
|
name: file_transports
|
||||||
x-displayName: File transports
|
x-displayName: File transports
|
||||||
|
- description: "System status\n"
|
||||||
|
name: status
|
||||||
|
x-displayName: Status
|
||||||
- description: "Manage tickets\n"
|
- description: "Manage tickets\n"
|
||||||
name: tickets
|
name: tickets
|
||||||
x-displayName: Tickets
|
x-displayName: Tickets
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,49 @@
|
||||||
|
#!/usr/bin/perl
|
||||||
|
|
||||||
|
# This file is part of Koha.
|
||||||
|
#
|
||||||
|
# Koha is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# Koha is distributed in the hope that it will be useful, but
|
||||||
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with Koha; if not, see <https://www.gnu.org/licenses>.
|
||||||
|
|
||||||
|
use Modern::Perl;
|
||||||
|
|
||||||
|
use Test::More tests => 3;
|
||||||
|
use Test::NoWarnings;
|
||||||
|
|
||||||
|
use Koha::Status;
|
||||||
|
|
||||||
|
subtest 'new' => sub {
|
||||||
|
plan tests => 1;
|
||||||
|
|
||||||
|
my $status = Koha::Status->new();
|
||||||
|
isa_ok( $status, 'Koha::Status', 'Constructor returns correct object type' );
|
||||||
|
};
|
||||||
|
|
||||||
|
subtest 'version' => sub {
|
||||||
|
plan tests => 7;
|
||||||
|
|
||||||
|
my $status = Koha::Status->new();
|
||||||
|
my $version_info = $status->version();
|
||||||
|
|
||||||
|
is( ref($version_info), 'HASH', 'version() returns a hashref' );
|
||||||
|
|
||||||
|
# Check required fields exist
|
||||||
|
ok( exists $version_info->{version}, 'version field exists' );
|
||||||
|
ok( exists $version_info->{major}, 'major field exists' );
|
||||||
|
ok( exists $version_info->{minor}, 'minor field exists' );
|
||||||
|
ok( exists $version_info->{release}, 'release field exists' );
|
||||||
|
ok( exists $version_info->{maintenance}, 'maintenance field exists' );
|
||||||
|
|
||||||
|
# Check version format and consistency
|
||||||
|
like( $version_info->{version}, qr/^\d+\.\d+\.\d+\.\d+$/, 'version has correct format' );
|
||||||
|
};
|
||||||
|
|
@ -0,0 +1,58 @@
|
||||||
|
#!/usr/bin/env perl
|
||||||
|
|
||||||
|
# This file is part of Koha.
|
||||||
|
#
|
||||||
|
# Koha is free software; you can redistribute it and/or modify it
|
||||||
|
# under the terms of the GNU General Public License as published by
|
||||||
|
# the Free Software Foundation; either version 3 of the License, or
|
||||||
|
# (at your option) any later version.
|
||||||
|
#
|
||||||
|
# Koha is distributed in the hope that it will be useful, but
|
||||||
|
# WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
# GNU General Public License for more details.
|
||||||
|
#
|
||||||
|
# You should have received a copy of the GNU General Public License
|
||||||
|
# along with Koha; if not, see <https://www.gnu.org/licenses>.
|
||||||
|
|
||||||
|
use Modern::Perl;
|
||||||
|
|
||||||
|
use Test::NoWarnings;
|
||||||
|
use Test::More tests => 2;
|
||||||
|
use Test::Mojo;
|
||||||
|
|
||||||
|
use t::lib::TestBuilder;
|
||||||
|
use t::lib::Mocks;
|
||||||
|
|
||||||
|
use Koha;
|
||||||
|
use Koha::Database;
|
||||||
|
|
||||||
|
my $schema = Koha::Database->new->schema;
|
||||||
|
my $builder = t::lib::TestBuilder->new;
|
||||||
|
|
||||||
|
my $t = Test::Mojo->new('Koha::REST::V1');
|
||||||
|
|
||||||
|
t::lib::Mocks::mock_preference( 'RESTBasicAuth', 1 );
|
||||||
|
|
||||||
|
subtest 'version() tests' => sub {
|
||||||
|
|
||||||
|
plan tests => 8;
|
||||||
|
|
||||||
|
$schema->storage->txn_begin;
|
||||||
|
|
||||||
|
my $librarian = $builder->build_object(
|
||||||
|
{
|
||||||
|
class => 'Koha::Patrons',
|
||||||
|
value => { flags => 2**2 }, # catalogue flag = 2
|
||||||
|
}
|
||||||
|
);
|
||||||
|
my $password = 'thePassword123';
|
||||||
|
$librarian->set_password( { password => $password, skip_validation => 1 } );
|
||||||
|
my $userid = $librarian->userid;
|
||||||
|
|
||||||
|
$t->get_ok("//$userid:$password@/api/v1/status/version")->status_is(200)->json_is( '/version' => Koha::version() )
|
||||||
|
->json_has('/major')->json_has('/minor')->json_has('/release')->json_has('/maintenance')
|
||||||
|
->json_like( '/version' => qr/^\d+\.\d+\.\d+\.\d+$/ );
|
||||||
|
|
||||||
|
$schema->storage->txn_rollback;
|
||||||
|
};
|
||||||
Loading…
Reference in New Issue