1
0
Fork 0
mirror of https://github.com/immich-app/immich.git synced 2024-12-29 15:11:58 +00:00

fix(server): correct openapi response type for getServerLicense() (#11261)

* fix(server): correct openapi response type for getServerLicense()

* return 404 error when license doesn't exist

* update e2e test
This commit is contained in:
Michel Heusschen 2024-07-22 15:50:45 +02:00 committed by GitHub
parent 3d7a9d79da
commit 849bc6e3aa
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
7 changed files with 34 additions and 12 deletions

View file

@ -254,7 +254,7 @@ describe('/server', () => {
.set('Authorization', `Bearer ${admin.accessToken}`) .set('Authorization', `Bearer ${admin.accessToken}`)
.send(serverLicense); .send(serverLicense);
const { status } = await request(app).get('/server/license').set('Authorization', `Bearer ${admin.accessToken}`); const { status } = await request(app).get('/server/license').set('Authorization', `Bearer ${admin.accessToken}`);
expect(status).toBe(200); expect(status).toBe(404);
}); });
}); });

Binary file not shown.

View file

@ -5022,11 +5022,14 @@
"content": { "content": {
"application/json": { "application/json": {
"schema": { "schema": {
"type": "object" "$ref": "#/components/schemas/LicenseResponseDto"
} }
} }
}, },
"description": "" "description": ""
},
"404": {
"description": ""
} }
}, },
"security": [ "security": [

View file

@ -880,12 +880,12 @@ export type ServerVersionResponseDto = {
minor: number; minor: number;
patch: number; patch: number;
}; };
export type LicenseKeyDto = { export type LicenseResponseDto = {
activatedAt: string;
activationKey: string; activationKey: string;
licenseKey: string; licenseKey: string;
}; };
export type LicenseResponseDto = { export type LicenseKeyDto = {
activatedAt: string;
activationKey: string; activationKey: string;
licenseKey: string; licenseKey: string;
}; };
@ -2511,7 +2511,9 @@ export function deleteServerLicense(opts?: Oazapfts.RequestOpts) {
export function getServerLicense(opts?: Oazapfts.RequestOpts) { export function getServerLicense(opts?: Oazapfts.RequestOpts) {
return oazapfts.ok(oazapfts.fetchJson<{ return oazapfts.ok(oazapfts.fetchJson<{
status: 200; status: 200;
data: object; data: LicenseResponseDto;
} | {
status: 404;
}>("/server/license", { }>("/server/license", {
...opts ...opts
})); }));

View file

@ -1,5 +1,5 @@
import { Body, Controller, Delete, Get, Put } from '@nestjs/common'; import { Body, Controller, Delete, Get, Put } from '@nestjs/common';
import { ApiExcludeEndpoint, ApiTags } from '@nestjs/swagger'; import { ApiExcludeEndpoint, ApiNotFoundResponse, ApiTags } from '@nestjs/swagger';
import { LicenseKeyDto, LicenseResponseDto } from 'src/dtos/license.dto'; import { LicenseKeyDto, LicenseResponseDto } from 'src/dtos/license.dto';
import { import {
ServerAboutResponseDto, ServerAboutResponseDto,
@ -95,7 +95,8 @@ export class ServerController {
@Get('license') @Get('license')
@Authenticated({ admin: true }) @Authenticated({ admin: true })
getServerLicense(): Promise<LicenseResponseDto | null> { @ApiNotFoundResponse()
getServerLicense(): Promise<LicenseResponseDto> {
return this.service.getLicense(); return this.service.getLicense();
} }
} }

View file

@ -1,4 +1,4 @@
import { BadRequestException, Inject, Injectable } from '@nestjs/common'; import { BadRequestException, Inject, Injectable, NotFoundException } from '@nestjs/common';
import { getBuildMetadata, getServerLicensePublicKey } from 'src/config'; import { getBuildMetadata, getServerLicensePublicKey } from 'src/config';
import { serverVersion } from 'src/constants'; import { serverVersion } from 'src/constants';
import { StorageCore, StorageFolder } from 'src/cores/storage.core'; import { StorageCore, StorageFolder } from 'src/cores/storage.core';
@ -164,8 +164,12 @@ export class ServerService implements OnEvents {
await this.systemMetadataRepository.delete(SystemMetadataKey.LICENSE); await this.systemMetadataRepository.delete(SystemMetadataKey.LICENSE);
} }
async getLicense(): Promise<LicenseResponseDto | null> { async getLicense(): Promise<LicenseResponseDto> {
return this.systemMetadataRepository.get(SystemMetadataKey.LICENSE); const license = await this.systemMetadataRepository.get(SystemMetadataKey.LICENSE);
if (!license) {
throw new NotFoundException();
}
return license;
} }
async setLicense(dto: LicenseKeyDto): Promise<LicenseResponseDto> { async setLicense(dto: LicenseKeyDto): Promise<LicenseResponseDto> {

View file

@ -10,6 +10,7 @@
getAboutInfo, getAboutInfo,
getMyUser, getMyUser,
getServerLicense, getServerLicense,
isHttpError,
type LicenseResponseDto, type LicenseResponseDto,
} from '@immich/sdk'; } from '@immich/sdk';
import Icon from '$lib/components/elements/icon.svelte'; import Icon from '$lib/components/elements/icon.svelte';
@ -36,7 +37,18 @@
} }
if (isServerLicense && $user.isAdmin) { if (isServerLicense && $user.isAdmin) {
serverLicenseInfo = (await getServerLicense()) as LicenseResponseDto | null; serverLicenseInfo = await getServerLicenseInfo();
}
};
const getServerLicenseInfo = async () => {
try {
return await getServerLicense();
} catch (error) {
if (isHttpError(error) && error.status === 404) {
return null;
}
throw error;
} }
}; };