feat(server): allow check available version to upgrade (#10767)
close CLOUD-159
This commit is contained in:
@@ -1,3 +1,4 @@
|
|||||||
|
import { Logger } from '@nestjs/common';
|
||||||
import {
|
import {
|
||||||
Args,
|
Args,
|
||||||
Field,
|
Field,
|
||||||
@@ -39,6 +40,27 @@ export class CredentialsRequirementType {
|
|||||||
registerEnumType(RuntimeConfigType, {
|
registerEnumType(RuntimeConfigType, {
|
||||||
name: 'RuntimeConfigType',
|
name: 'RuntimeConfigType',
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ObjectType()
|
||||||
|
export class ReleaseVersionType {
|
||||||
|
@Field()
|
||||||
|
version!: string;
|
||||||
|
|
||||||
|
@Field()
|
||||||
|
url!: string;
|
||||||
|
|
||||||
|
@Field(() => GraphQLISODateTime)
|
||||||
|
publishedAt!: Date;
|
||||||
|
|
||||||
|
@Field()
|
||||||
|
changelog!: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
const RELEASE_CHANNEL_MAP = new Map<Config['AFFINE_ENV'], string>([
|
||||||
|
['dev', 'canary'],
|
||||||
|
['beta', 'beta'],
|
||||||
|
['production', 'stable'],
|
||||||
|
]);
|
||||||
@ObjectType()
|
@ObjectType()
|
||||||
export class ServerRuntimeConfigType implements Partial<RuntimeConfig> {
|
export class ServerRuntimeConfigType implements Partial<RuntimeConfig> {
|
||||||
@Field()
|
@Field()
|
||||||
@@ -74,6 +96,8 @@ export class ServerFlagsType implements ServerFlags {
|
|||||||
|
|
||||||
@Resolver(() => ServerConfigType)
|
@Resolver(() => ServerConfigType)
|
||||||
export class ServerConfigResolver {
|
export class ServerConfigResolver {
|
||||||
|
private readonly logger = new Logger(ServerConfigResolver.name);
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private readonly config: Config,
|
private readonly config: Config,
|
||||||
private readonly runtime: Runtime,
|
private readonly runtime: Runtime,
|
||||||
@@ -135,6 +159,53 @@ export class ServerConfigResolver {
|
|||||||
async initialized() {
|
async initialized() {
|
||||||
return this.server.initialized();
|
return this.server.initialized();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ResolveField(() => ReleaseVersionType, {
|
||||||
|
description: 'fetch latest available upgradable release of server',
|
||||||
|
})
|
||||||
|
async availableUpgrade(): Promise<ReleaseVersionType | null> {
|
||||||
|
const channel = RELEASE_CHANNEL_MAP.get(this.config.AFFINE_ENV) ?? 'stable';
|
||||||
|
const url = `https://affine.pro/api/worker/releases?channel=${channel}`;
|
||||||
|
|
||||||
|
try {
|
||||||
|
const response = await fetch(url, {
|
||||||
|
method: 'GET',
|
||||||
|
headers: {
|
||||||
|
Accept: 'application/json',
|
||||||
|
'Cache-Control': 'no-cache',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
if (!response.ok) {
|
||||||
|
this.logger.error(
|
||||||
|
'failed to fetch affine releases',
|
||||||
|
await response.text()
|
||||||
|
);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
const releases = (await response.json()) as Array<{
|
||||||
|
name: string;
|
||||||
|
url: string;
|
||||||
|
body: string;
|
||||||
|
published_at: string;
|
||||||
|
}>;
|
||||||
|
|
||||||
|
const latest = releases.at(0);
|
||||||
|
if (!latest || latest.name === this.config.version) {
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
return {
|
||||||
|
version: latest.name,
|
||||||
|
url: latest.url,
|
||||||
|
changelog: latest.body,
|
||||||
|
publishedAt: new Date(latest.published_at),
|
||||||
|
};
|
||||||
|
} catch (e) {
|
||||||
|
this.logger.error('failed to fetch affine releases', e);
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Resolver(() => ServerConfigType)
|
@Resolver(() => ServerConfigType)
|
||||||
|
|||||||
@@ -1091,6 +1091,13 @@ type QueryTooLongDataType {
|
|||||||
max: Int!
|
max: Int!
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type ReleaseVersionType {
|
||||||
|
changelog: String!
|
||||||
|
publishedAt: DateTime!
|
||||||
|
url: String!
|
||||||
|
version: String!
|
||||||
|
}
|
||||||
|
|
||||||
type RemoveAvatar {
|
type RemoveAvatar {
|
||||||
success: Boolean!
|
success: Boolean!
|
||||||
}
|
}
|
||||||
@@ -1128,6 +1135,9 @@ type SameSubscriptionRecurringDataType {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type ServerConfigType {
|
type ServerConfigType {
|
||||||
|
"""fetch latest available upgradable release of server"""
|
||||||
|
availableUpgrade: ReleaseVersionType!
|
||||||
|
|
||||||
"""Features for user that can be configured"""
|
"""Features for user that can be configured"""
|
||||||
availableUserFeatures: [FeatureType!]!
|
availableUserFeatures: [FeatureType!]!
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user