Show version in UI (for admin users).

Closes #73 and #158.
This commit is contained in:
Orne Brocaar
2024-03-26 09:01:21 +00:00
parent 54b10cb693
commit f970e94cca
36 changed files with 877 additions and 54 deletions

View File

@ -24,6 +24,7 @@ interface IInternalServiceService extends grpc.ServiceDefinition<grpc.UntypedSer
streamDeviceEvents: grpc.MethodDefinition<api_internal_pb.StreamDeviceEventsRequest, api_internal_pb.LogItem>;
listRegions: grpc.MethodDefinition<google_protobuf_empty_pb.Empty, api_internal_pb.ListRegionsResponse>;
getRegion: grpc.MethodDefinition<api_internal_pb.GetRegionRequest, api_internal_pb.GetRegionResponse>;
getVersion: grpc.MethodDefinition<google_protobuf_empty_pb.Empty, api_internal_pb.GetVersionResponse>;
}
export const InternalServiceService: IInternalServiceService;
@ -45,6 +46,7 @@ export interface IInternalServiceServer extends grpc.UntypedServiceImplementatio
streamDeviceEvents: grpc.handleServerStreamingCall<api_internal_pb.StreamDeviceEventsRequest, api_internal_pb.LogItem>;
listRegions: grpc.handleUnaryCall<google_protobuf_empty_pb.Empty, api_internal_pb.ListRegionsResponse>;
getRegion: grpc.handleUnaryCall<api_internal_pb.GetRegionRequest, api_internal_pb.GetRegionResponse>;
getVersion: grpc.handleUnaryCall<google_protobuf_empty_pb.Empty, api_internal_pb.GetVersionResponse>;
}
export class InternalServiceClient extends grpc.Client {
@ -94,4 +96,7 @@ export class InternalServiceClient extends grpc.Client {
getRegion(argument: api_internal_pb.GetRegionRequest, callback: grpc.requestCallback<api_internal_pb.GetRegionResponse>): grpc.ClientUnaryCall;
getRegion(argument: api_internal_pb.GetRegionRequest, metadataOrOptions: grpc.Metadata | grpc.CallOptions | null, callback: grpc.requestCallback<api_internal_pb.GetRegionResponse>): grpc.ClientUnaryCall;
getRegion(argument: api_internal_pb.GetRegionRequest, metadata: grpc.Metadata | null, options: grpc.CallOptions | null, callback: grpc.requestCallback<api_internal_pb.GetRegionResponse>): grpc.ClientUnaryCall;
getVersion(argument: google_protobuf_empty_pb.Empty, callback: grpc.requestCallback<api_internal_pb.GetVersionResponse>): grpc.ClientUnaryCall;
getVersion(argument: google_protobuf_empty_pb.Empty, metadataOrOptions: grpc.Metadata | grpc.CallOptions | null, callback: grpc.requestCallback<api_internal_pb.GetVersionResponse>): grpc.ClientUnaryCall;
getVersion(argument: google_protobuf_empty_pb.Empty, metadata: grpc.Metadata | null, options: grpc.CallOptions | null, callback: grpc.requestCallback<api_internal_pb.GetVersionResponse>): grpc.ClientUnaryCall;
}

View File

@ -107,6 +107,17 @@ function deserialize_api_GetRegionResponse(buffer_arg) {
return api_internal_pb.GetRegionResponse.deserializeBinary(new Uint8Array(buffer_arg));
}
function serialize_api_GetVersionResponse(arg) {
if (!(arg instanceof api_internal_pb.GetVersionResponse)) {
throw new Error('Expected argument of type api.GetVersionResponse');
}
return Buffer.from(arg.serializeBinary());
}
function deserialize_api_GetVersionResponse(buffer_arg) {
return api_internal_pb.GetVersionResponse.deserializeBinary(new Uint8Array(buffer_arg));
}
function serialize_api_GlobalSearchRequest(arg) {
if (!(arg instanceof api_internal_pb.GlobalSearchRequest)) {
throw new Error('Expected argument of type api.GlobalSearchRequest');
@ -500,6 +511,18 @@ getRegion: {
responseSerialize: serialize_api_GetRegionResponse,
responseDeserialize: deserialize_api_GetRegionResponse,
},
// GetVersion returns the ChirpStack version.
getVersion: {
path: '/api.InternalService/GetVersion',
requestStream: false,
responseStream: false,
requestType: google_protobuf_empty_pb.Empty,
responseType: api_internal_pb.GetVersionResponse,
requestSerialize: serialize_google_protobuf_Empty,
requestDeserialize: deserialize_google_protobuf_Empty,
responseSerialize: serialize_api_GetVersionResponse,
responseDeserialize: deserialize_api_GetVersionResponse,
},
};
exports.InternalServiceClient = grpc.makeGenericClientConstructor(InternalServiceService);

View File

@ -929,3 +929,23 @@ export namespace RegionChannel {
}
}
export class GetVersionResponse extends jspb.Message {
getVersion(): string;
setVersion(value: string): void;
serializeBinary(): Uint8Array;
toObject(includeInstance?: boolean): GetVersionResponse.AsObject;
static toObject(includeInstance: boolean, msg: GetVersionResponse): GetVersionResponse.AsObject;
static extensions: {[key: number]: jspb.ExtensionFieldInfo<jspb.Message>};
static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo<jspb.Message>};
static serializeBinaryToWriter(message: GetVersionResponse, writer: jspb.BinaryWriter): void;
static deserializeBinary(bytes: Uint8Array): GetVersionResponse;
static deserializeBinaryFromReader(message: GetVersionResponse, reader: jspb.BinaryReader): GetVersionResponse;
}
export namespace GetVersionResponse {
export type AsObject = {
version: string,
}
}

View File

@ -30,6 +30,7 @@ goog.exportSymbol('proto.api.GetGatewaysSummaryRequest', null, global);
goog.exportSymbol('proto.api.GetGatewaysSummaryResponse', null, global);
goog.exportSymbol('proto.api.GetRegionRequest', null, global);
goog.exportSymbol('proto.api.GetRegionResponse', null, global);
goog.exportSymbol('proto.api.GetVersionResponse', null, global);
goog.exportSymbol('proto.api.GlobalSearchRequest', null, global);
goog.exportSymbol('proto.api.GlobalSearchResponse', null, global);
goog.exportSymbol('proto.api.GlobalSearchResult', null, global);
@ -746,6 +747,27 @@ if (goog.DEBUG && !COMPILED) {
*/
proto.api.RegionChannel.displayName = 'proto.api.RegionChannel';
}
/**
* Generated by JsPbCodeGenerator.
* @param {Array=} opt_data Optional initial data array, typically from a
* server response, or constructed directly in Javascript. The array is used
* in place and becomes part of the constructed object. It is not cloned.
* If no data is provided, the constructed object will be empty, but still
* valid.
* @extends {jspb.Message}
* @constructor
*/
proto.api.GetVersionResponse = function(opt_data) {
jspb.Message.initialize(this, opt_data, 0, -1, null, null);
};
goog.inherits(proto.api.GetVersionResponse, jspb.Message);
if (goog.DEBUG && !COMPILED) {
/**
* @public
* @override
*/
proto.api.GetVersionResponse.displayName = 'proto.api.GetVersionResponse';
}
@ -7139,4 +7161,134 @@ proto.api.RegionChannel.prototype.setDrMax = function(value) {
};
if (jspb.Message.GENERATE_TO_OBJECT) {
/**
* Creates an object representation of this proto.
* Field names that are reserved in JavaScript and will be renamed to pb_name.
* Optional fields that are not set will be set to undefined.
* To access a reserved field use, foo.pb_<name>, eg, foo.pb_default.
* For the list of reserved names please see:
* net/proto2/compiler/js/internal/generator.cc#kKeyword.
* @param {boolean=} opt_includeInstance Deprecated. whether to include the
* JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @return {!Object}
*/
proto.api.GetVersionResponse.prototype.toObject = function(opt_includeInstance) {
return proto.api.GetVersionResponse.toObject(opt_includeInstance, this);
};
/**
* Static version of the {@see toObject} method.
* @param {boolean|undefined} includeInstance Deprecated. Whether to include
* the JSPB instance for transitional soy proto support:
* http://goto/soy-param-migration
* @param {!proto.api.GetVersionResponse} msg The msg instance to transform.
* @return {!Object}
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.api.GetVersionResponse.toObject = function(includeInstance, msg) {
var f, obj = {
version: jspb.Message.getFieldWithDefault(msg, 1, "")
};
if (includeInstance) {
obj.$jspbMessageInstance = msg;
}
return obj;
};
}
/**
* Deserializes binary data (in protobuf wire format).
* @param {jspb.ByteSource} bytes The bytes to deserialize.
* @return {!proto.api.GetVersionResponse}
*/
proto.api.GetVersionResponse.deserializeBinary = function(bytes) {
var reader = new jspb.BinaryReader(bytes);
var msg = new proto.api.GetVersionResponse;
return proto.api.GetVersionResponse.deserializeBinaryFromReader(msg, reader);
};
/**
* Deserializes binary data (in protobuf wire format) from the
* given reader into the given message object.
* @param {!proto.api.GetVersionResponse} msg The message object to deserialize into.
* @param {!jspb.BinaryReader} reader The BinaryReader to use.
* @return {!proto.api.GetVersionResponse}
*/
proto.api.GetVersionResponse.deserializeBinaryFromReader = function(msg, reader) {
while (reader.nextField()) {
if (reader.isEndGroup()) {
break;
}
var field = reader.getFieldNumber();
switch (field) {
case 1:
var value = /** @type {string} */ (reader.readString());
msg.setVersion(value);
break;
default:
reader.skipField();
break;
}
}
return msg;
};
/**
* Serializes the message to binary data (in protobuf wire format).
* @return {!Uint8Array}
*/
proto.api.GetVersionResponse.prototype.serializeBinary = function() {
var writer = new jspb.BinaryWriter();
proto.api.GetVersionResponse.serializeBinaryToWriter(this, writer);
return writer.getResultBuffer();
};
/**
* Serializes the given message to binary data (in protobuf wire
* format), writing to the given BinaryWriter.
* @param {!proto.api.GetVersionResponse} message
* @param {!jspb.BinaryWriter} writer
* @suppress {unusedLocalVariables} f is only used for nested messages
*/
proto.api.GetVersionResponse.serializeBinaryToWriter = function(message, writer) {
var f = undefined;
f = message.getVersion();
if (f.length > 0) {
writer.writeString(
1,
f
);
}
};
/**
* optional string version = 1;
* @return {string}
*/
proto.api.GetVersionResponse.prototype.getVersion = function() {
return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, ""));
};
/**
* @param {string} value
* @return {!proto.api.GetVersionResponse} returns this
*/
proto.api.GetVersionResponse.prototype.setVersion = function(value) {
return jspb.Message.setProto3StringField(this, 1, value);
};
goog.object.extend(exports, proto.api);