diff --git a/api/v1alpha1/weather/weather.pb.go b/api/v1alpha1/weather/weather.pb.go index 3fbbd50..1559242 100644 --- a/api/v1alpha1/weather/weather.pb.go +++ b/api/v1alpha1/weather/weather.pb.go @@ -22,6 +22,94 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +type CountWeatherUpdatesRequest struct { + state protoimpl.MessageState `protogen:"open.v1"` + Opts *GetWeatherOpts `protobuf:"bytes,1,opt,name=opts,proto3" json:"opts,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CountWeatherUpdatesRequest) Reset() { + *x = CountWeatherUpdatesRequest{} + mi := &file_weather_weather_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CountWeatherUpdatesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CountWeatherUpdatesRequest) ProtoMessage() {} + +func (x *CountWeatherUpdatesRequest) ProtoReflect() protoreflect.Message { + mi := &file_weather_weather_proto_msgTypes[0] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CountWeatherUpdatesRequest.ProtoReflect.Descriptor instead. +func (*CountWeatherUpdatesRequest) Descriptor() ([]byte, []int) { + return file_weather_weather_proto_rawDescGZIP(), []int{0} +} + +func (x *CountWeatherUpdatesRequest) GetOpts() *GetWeatherOpts { + if x != nil { + return x.Opts + } + return nil +} + +type CountWeatherUpdatesResponse struct { + state protoimpl.MessageState `protogen:"open.v1"` + Count int32 `protobuf:"varint,1,opt,name=count,proto3" json:"count,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *CountWeatherUpdatesResponse) Reset() { + *x = CountWeatherUpdatesResponse{} + mi := &file_weather_weather_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CountWeatherUpdatesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CountWeatherUpdatesResponse) ProtoMessage() {} + +func (x *CountWeatherUpdatesResponse) ProtoReflect() protoreflect.Message { + mi := &file_weather_weather_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CountWeatherUpdatesResponse.ProtoReflect.Descriptor instead. +func (*CountWeatherUpdatesResponse) Descriptor() ([]byte, []int) { + return file_weather_weather_proto_rawDescGZIP(), []int{1} +} + +func (x *CountWeatherUpdatesResponse) GetCount() int32 { + if x != nil { + return x.Count + } + return 0 +} + type GetWeatherRequest struct { state protoimpl.MessageState `protogen:"open.v1"` Opts *GetWeatherOpts `protobuf:"bytes,1,opt,name=opts,proto3" json:"opts,omitempty"` @@ -32,7 +120,7 @@ type GetWeatherRequest struct { func (x *GetWeatherRequest) Reset() { *x = GetWeatherRequest{} - mi := &file_weather_weather_proto_msgTypes[0] + mi := &file_weather_weather_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -44,7 +132,7 @@ func (x *GetWeatherRequest) String() string { func (*GetWeatherRequest) ProtoMessage() {} func (x *GetWeatherRequest) ProtoReflect() protoreflect.Message { - mi := &file_weather_weather_proto_msgTypes[0] + mi := &file_weather_weather_proto_msgTypes[2] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -57,7 +145,7 @@ func (x *GetWeatherRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWeatherRequest.ProtoReflect.Descriptor instead. func (*GetWeatherRequest) Descriptor() ([]byte, []int) { - return file_weather_weather_proto_rawDescGZIP(), []int{0} + return file_weather_weather_proto_rawDescGZIP(), []int{2} } func (x *GetWeatherRequest) GetOpts() *GetWeatherOpts { @@ -84,7 +172,7 @@ type GetWeatherResponse struct { func (x *GetWeatherResponse) Reset() { *x = GetWeatherResponse{} - mi := &file_weather_weather_proto_msgTypes[1] + mi := &file_weather_weather_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -96,7 +184,7 @@ func (x *GetWeatherResponse) String() string { func (*GetWeatherResponse) ProtoMessage() {} func (x *GetWeatherResponse) ProtoReflect() protoreflect.Message { - mi := &file_weather_weather_proto_msgTypes[1] + mi := &file_weather_weather_proto_msgTypes[3] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -109,7 +197,7 @@ func (x *GetWeatherResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWeatherResponse.ProtoReflect.Descriptor instead. func (*GetWeatherResponse) Descriptor() ([]byte, []int) { - return file_weather_weather_proto_rawDescGZIP(), []int{1} + return file_weather_weather_proto_rawDescGZIP(), []int{3} } func (x *GetWeatherResponse) GetLastUpdated() *timestamppb.Timestamp { @@ -136,7 +224,7 @@ type GetWeatherOpts struct { func (x *GetWeatherOpts) Reset() { *x = GetWeatherOpts{} - mi := &file_weather_weather_proto_msgTypes[2] + mi := &file_weather_weather_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -148,7 +236,7 @@ func (x *GetWeatherOpts) String() string { func (*GetWeatherOpts) ProtoMessage() {} func (x *GetWeatherOpts) ProtoReflect() protoreflect.Message { - mi := &file_weather_weather_proto_msgTypes[2] + mi := &file_weather_weather_proto_msgTypes[4] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -161,7 +249,7 @@ func (x *GetWeatherOpts) ProtoReflect() protoreflect.Message { // Deprecated: Use GetWeatherOpts.ProtoReflect.Descriptor instead. func (*GetWeatherOpts) Descriptor() ([]byte, []int) { - return file_weather_weather_proto_rawDescGZIP(), []int{2} + return file_weather_weather_proto_rawDescGZIP(), []int{4} } func (x *GetWeatherOpts) GetStationName() string { @@ -214,7 +302,7 @@ type WeatherUpdate struct { func (x *WeatherUpdate) Reset() { *x = WeatherUpdate{} - mi := &file_weather_weather_proto_msgTypes[3] + mi := &file_weather_weather_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -226,7 +314,7 @@ func (x *WeatherUpdate) String() string { func (*WeatherUpdate) ProtoMessage() {} func (x *WeatherUpdate) ProtoReflect() protoreflect.Message { - mi := &file_weather_weather_proto_msgTypes[3] + mi := &file_weather_weather_proto_msgTypes[5] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -239,7 +327,7 @@ func (x *WeatherUpdate) ProtoReflect() protoreflect.Message { // Deprecated: Use WeatherUpdate.ProtoReflect.Descriptor instead. func (*WeatherUpdate) Descriptor() ([]byte, []int) { - return file_weather_weather_proto_rawDescGZIP(), []int{3} + return file_weather_weather_proto_rawDescGZIP(), []int{5} } func (x *WeatherUpdate) GetStationName() string { @@ -450,7 +538,7 @@ type TempHumiditySensor struct { func (x *TempHumiditySensor) Reset() { *x = TempHumiditySensor{} - mi := &file_weather_weather_proto_msgTypes[4] + mi := &file_weather_weather_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -462,7 +550,7 @@ func (x *TempHumiditySensor) String() string { func (*TempHumiditySensor) ProtoMessage() {} func (x *TempHumiditySensor) ProtoReflect() protoreflect.Message { - mi := &file_weather_weather_proto_msgTypes[4] + mi := &file_weather_weather_proto_msgTypes[6] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -475,7 +563,7 @@ func (x *TempHumiditySensor) ProtoReflect() protoreflect.Message { // Deprecated: Use TempHumiditySensor.ProtoReflect.Descriptor instead. func (*TempHumiditySensor) Descriptor() ([]byte, []int) { - return file_weather_weather_proto_rawDescGZIP(), []int{4} + return file_weather_weather_proto_rawDescGZIP(), []int{6} } func (x *TempHumiditySensor) GetName() string { @@ -510,7 +598,7 @@ type BatteryStatus struct { func (x *BatteryStatus) Reset() { *x = BatteryStatus{} - mi := &file_weather_weather_proto_msgTypes[5] + mi := &file_weather_weather_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -522,7 +610,7 @@ func (x *BatteryStatus) String() string { func (*BatteryStatus) ProtoMessage() {} func (x *BatteryStatus) ProtoReflect() protoreflect.Message { - mi := &file_weather_weather_proto_msgTypes[5] + mi := &file_weather_weather_proto_msgTypes[7] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -535,7 +623,7 @@ func (x *BatteryStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use BatteryStatus.ProtoReflect.Descriptor instead. func (*BatteryStatus) Descriptor() ([]byte, []int) { - return file_weather_weather_proto_rawDescGZIP(), []int{5} + return file_weather_weather_proto_rawDescGZIP(), []int{7} } func (x *BatteryStatus) GetComponent() string { @@ -556,7 +644,11 @@ var File_weather_weather_proto protoreflect.FileDescriptor const file_weather_weather_proto_rawDesc = "" + "\n" + - "\x15weather/weather.proto\x12\x0fambient.weather\x1a\x1fgoogle/protobuf/timestamp.proto\"m\n" + + "\x15weather/weather.proto\x12\x0fambient.weather\x1a\x1fgoogle/protobuf/timestamp.proto\"Q\n" + + "\x1aCountWeatherUpdatesRequest\x123\n" + + "\x04opts\x18\x01 \x01(\v2\x1f.ambient.weather.GetWeatherOptsR\x04opts\"3\n" + + "\x1bCountWeatherUpdatesResponse\x12\x14\n" + + "\x05count\x18\x01 \x01(\x05R\x05count\"m\n" + "\x11GetWeatherRequest\x123\n" + "\x04opts\x18\x01 \x01(\v2\x1f.ambient.weather.GetWeatherOptsR\x04opts\x12\x19\n" + "\x05limit\x18\x02 \x01(\x05H\x00R\x05limit\x88\x01\x01B\b\n" + @@ -647,28 +739,31 @@ func file_weather_weather_proto_rawDescGZIP() []byte { return file_weather_weather_proto_rawDescData } -var file_weather_weather_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_weather_weather_proto_msgTypes = make([]protoimpl.MessageInfo, 8) var file_weather_weather_proto_goTypes = []any{ - (*GetWeatherRequest)(nil), // 0: ambient.weather.GetWeatherRequest - (*GetWeatherResponse)(nil), // 1: ambient.weather.GetWeatherResponse - (*GetWeatherOpts)(nil), // 2: ambient.weather.GetWeatherOpts - (*WeatherUpdate)(nil), // 3: ambient.weather.WeatherUpdate - (*TempHumiditySensor)(nil), // 4: ambient.weather.TempHumiditySensor - (*BatteryStatus)(nil), // 5: ambient.weather.BatteryStatus - (*timestamppb.Timestamp)(nil), // 6: google.protobuf.Timestamp + (*CountWeatherUpdatesRequest)(nil), // 0: ambient.weather.CountWeatherUpdatesRequest + (*CountWeatherUpdatesResponse)(nil), // 1: ambient.weather.CountWeatherUpdatesResponse + (*GetWeatherRequest)(nil), // 2: ambient.weather.GetWeatherRequest + (*GetWeatherResponse)(nil), // 3: ambient.weather.GetWeatherResponse + (*GetWeatherOpts)(nil), // 4: ambient.weather.GetWeatherOpts + (*WeatherUpdate)(nil), // 5: ambient.weather.WeatherUpdate + (*TempHumiditySensor)(nil), // 6: ambient.weather.TempHumiditySensor + (*BatteryStatus)(nil), // 7: ambient.weather.BatteryStatus + (*timestamppb.Timestamp)(nil), // 8: google.protobuf.Timestamp } var file_weather_weather_proto_depIdxs = []int32{ - 2, // 0: ambient.weather.GetWeatherRequest.opts:type_name -> ambient.weather.GetWeatherOpts - 6, // 1: ambient.weather.GetWeatherResponse.last_updated:type_name -> google.protobuf.Timestamp - 3, // 2: ambient.weather.GetWeatherResponse.weather_updates:type_name -> ambient.weather.WeatherUpdate - 5, // 3: ambient.weather.WeatherUpdate.batteries:type_name -> ambient.weather.BatteryStatus - 4, // 4: ambient.weather.WeatherUpdate.temp_humidity_sensors:type_name -> ambient.weather.TempHumiditySensor - 6, // 5: ambient.weather.WeatherUpdate.update_timestamp:type_name -> google.protobuf.Timestamp - 6, // [6:6] is the sub-list for method output_type - 6, // [6:6] is the sub-list for method input_type - 6, // [6:6] is the sub-list for extension type_name - 6, // [6:6] is the sub-list for extension extendee - 0, // [0:6] is the sub-list for field type_name + 4, // 0: ambient.weather.CountWeatherUpdatesRequest.opts:type_name -> ambient.weather.GetWeatherOpts + 4, // 1: ambient.weather.GetWeatherRequest.opts:type_name -> ambient.weather.GetWeatherOpts + 8, // 2: ambient.weather.GetWeatherResponse.last_updated:type_name -> google.protobuf.Timestamp + 5, // 3: ambient.weather.GetWeatherResponse.weather_updates:type_name -> ambient.weather.WeatherUpdate + 7, // 4: ambient.weather.WeatherUpdate.batteries:type_name -> ambient.weather.BatteryStatus + 6, // 5: ambient.weather.WeatherUpdate.temp_humidity_sensors:type_name -> ambient.weather.TempHumiditySensor + 8, // 6: ambient.weather.WeatherUpdate.update_timestamp:type_name -> google.protobuf.Timestamp + 7, // [7:7] is the sub-list for method output_type + 7, // [7:7] is the sub-list for method input_type + 7, // [7:7] is the sub-list for extension type_name + 7, // [7:7] is the sub-list for extension extendee + 0, // [0:7] is the sub-list for field type_name } func init() { file_weather_weather_proto_init() } @@ -676,18 +771,18 @@ func file_weather_weather_proto_init() { if File_weather_weather_proto != nil { return } - file_weather_weather_proto_msgTypes[0].OneofWrappers = []any{} file_weather_weather_proto_msgTypes[2].OneofWrappers = []any{} - file_weather_weather_proto_msgTypes[3].OneofWrappers = []any{} file_weather_weather_proto_msgTypes[4].OneofWrappers = []any{} file_weather_weather_proto_msgTypes[5].OneofWrappers = []any{} + file_weather_weather_proto_msgTypes[6].OneofWrappers = []any{} + file_weather_weather_proto_msgTypes[7].OneofWrappers = []any{} type x struct{} out := protoimpl.TypeBuilder{ File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_weather_weather_proto_rawDesc), len(file_weather_weather_proto_rawDesc)), NumEnums: 0, - NumMessages: 6, + NumMessages: 8, NumExtensions: 0, NumServices: 0, }, diff --git a/api/v1alpha1/weather/weather_service.pb.go b/api/v1alpha1/weather/weather_service.pb.go index a8aee4a..5578a58 100644 --- a/api/v1alpha1/weather/weather_service.pb.go +++ b/api/v1alpha1/weather/weather_service.pb.go @@ -25,20 +25,25 @@ var File_weather_weather_service_proto protoreflect.FileDescriptor const file_weather_weather_service_proto_rawDesc = "" + "\n" + - "\x1dweather/weather_service.proto\x12\x0fambient.weather\x1a\x1cgoogle/api/annotations.proto\x1a\x15weather/weather.proto2\x88\x01\n" + + "\x1dweather/weather_service.proto\x12\x0fambient.weather\x1a\x1cgoogle/api/annotations.proto\x1a\x15weather/weather.proto2\x8e\x02\n" + "\x1aAmbientLocalWeatherService\x12j\n" + "\n" + - "GetWeather\x12\".ambient.weather.GetWeatherRequest\x1a#.ambient.weather.GetWeatherResponse\"\x13\x82\xd3\xe4\x93\x02\r\x12\v/v1/weatherBTZRgitea.libretechconsulting.com/rmcguire/ambient-local-exporter/api/v1alpha1/weatherb\x06proto3" + "GetWeather\x12\".ambient.weather.GetWeatherRequest\x1a#.ambient.weather.GetWeatherResponse\"\x13\x82\xd3\xe4\x93\x02\r\x12\v/v1/weather\x12\x83\x01\n" + + "\x13CountWeatherUpdates\x12+.ambient.weather.CountWeatherUpdatesRequest\x1a,.ambient.weather.CountWeatherUpdatesResponse\"\x11\x82\xd3\xe4\x93\x02\v\x12\t/v1/countBTZRgitea.libretechconsulting.com/rmcguire/ambient-local-exporter/api/v1alpha1/weatherb\x06proto3" var file_weather_weather_service_proto_goTypes = []any{ - (*GetWeatherRequest)(nil), // 0: ambient.weather.GetWeatherRequest - (*GetWeatherResponse)(nil), // 1: ambient.weather.GetWeatherResponse + (*GetWeatherRequest)(nil), // 0: ambient.weather.GetWeatherRequest + (*CountWeatherUpdatesRequest)(nil), // 1: ambient.weather.CountWeatherUpdatesRequest + (*GetWeatherResponse)(nil), // 2: ambient.weather.GetWeatherResponse + (*CountWeatherUpdatesResponse)(nil), // 3: ambient.weather.CountWeatherUpdatesResponse } var file_weather_weather_service_proto_depIdxs = []int32{ 0, // 0: ambient.weather.AmbientLocalWeatherService.GetWeather:input_type -> ambient.weather.GetWeatherRequest - 1, // 1: ambient.weather.AmbientLocalWeatherService.GetWeather:output_type -> ambient.weather.GetWeatherResponse - 1, // [1:2] is the sub-list for method output_type - 0, // [0:1] is the sub-list for method input_type + 1, // 1: ambient.weather.AmbientLocalWeatherService.CountWeatherUpdates:input_type -> ambient.weather.CountWeatherUpdatesRequest + 2, // 2: ambient.weather.AmbientLocalWeatherService.GetWeather:output_type -> ambient.weather.GetWeatherResponse + 3, // 3: ambient.weather.AmbientLocalWeatherService.CountWeatherUpdates:output_type -> ambient.weather.CountWeatherUpdatesResponse + 2, // [2:4] is the sub-list for method output_type + 0, // [0:2] is the sub-list for method input_type 0, // [0:0] is the sub-list for extension type_name 0, // [0:0] is the sub-list for extension extendee 0, // [0:0] is the sub-list for field type_name diff --git a/api/v1alpha1/weather/weather_service.pb.gw.go b/api/v1alpha1/weather/weather_service.pb.gw.go index 2b86678..7c65f63 100644 --- a/api/v1alpha1/weather/weather_service.pb.gw.go +++ b/api/v1alpha1/weather/weather_service.pb.gw.go @@ -68,6 +68,39 @@ func local_request_AmbientLocalWeatherService_GetWeather_0(ctx context.Context, return msg, metadata, err } +var filter_AmbientLocalWeatherService_CountWeatherUpdates_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} + +func request_AmbientLocalWeatherService_CountWeatherUpdates_0(ctx context.Context, marshaler runtime.Marshaler, client AmbientLocalWeatherServiceClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CountWeatherUpdatesRequest + metadata runtime.ServerMetadata + ) + io.Copy(io.Discard, req.Body) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AmbientLocalWeatherService_CountWeatherUpdates_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := client.CountWeatherUpdates(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err +} + +func local_request_AmbientLocalWeatherService_CountWeatherUpdates_0(ctx context.Context, marshaler runtime.Marshaler, server AmbientLocalWeatherServiceServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var ( + protoReq CountWeatherUpdatesRequest + metadata runtime.ServerMetadata + ) + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_AmbientLocalWeatherService_CountWeatherUpdates_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + msg, err := server.CountWeatherUpdates(ctx, &protoReq) + return msg, metadata, err +} + // RegisterAmbientLocalWeatherServiceHandlerServer registers the http handlers for service AmbientLocalWeatherService to "mux". // UnaryRPC :call AmbientLocalWeatherServiceServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -94,6 +127,26 @@ func RegisterAmbientLocalWeatherServiceHandlerServer(ctx context.Context, mux *r } forward_AmbientLocalWeatherService_GetWeather_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) + mux.Handle(http.MethodGet, pattern_AmbientLocalWeatherService_CountWeatherUpdates_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/ambient.weather.AmbientLocalWeatherService/CountWeatherUpdates", runtime.WithHTTPPathPattern("/v1/count")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_AmbientLocalWeatherService_CountWeatherUpdates_0(annotatedContext, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AmbientLocalWeatherService_CountWeatherUpdates_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) return nil } @@ -151,13 +204,32 @@ func RegisterAmbientLocalWeatherServiceHandlerClient(ctx context.Context, mux *r } forward_AmbientLocalWeatherService_GetWeather_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) }) + mux.Handle(http.MethodGet, pattern_AmbientLocalWeatherService_CountWeatherUpdates_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + annotatedContext, err := runtime.AnnotateContext(ctx, mux, req, "/ambient.weather.AmbientLocalWeatherService/CountWeatherUpdates", runtime.WithHTTPPathPattern("/v1/count")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_AmbientLocalWeatherService_CountWeatherUpdates_0(annotatedContext, inboundMarshaler, client, req, pathParams) + annotatedContext = runtime.NewServerMetadataContext(annotatedContext, md) + if err != nil { + runtime.HTTPError(annotatedContext, mux, outboundMarshaler, w, req, err) + return + } + forward_AmbientLocalWeatherService_CountWeatherUpdates_0(annotatedContext, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + }) return nil } var ( - pattern_AmbientLocalWeatherService_GetWeather_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "weather"}, "")) + pattern_AmbientLocalWeatherService_GetWeather_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "weather"}, "")) + pattern_AmbientLocalWeatherService_CountWeatherUpdates_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "count"}, "")) ) var ( - forward_AmbientLocalWeatherService_GetWeather_0 = runtime.ForwardResponseMessage + forward_AmbientLocalWeatherService_GetWeather_0 = runtime.ForwardResponseMessage + forward_AmbientLocalWeatherService_CountWeatherUpdates_0 = runtime.ForwardResponseMessage ) diff --git a/api/v1alpha1/weather/weather_service.swagger.json b/api/v1alpha1/weather/weather_service.swagger.json index 7d0203a..adb00ca 100644 --- a/api/v1alpha1/weather/weather_service.swagger.json +++ b/api/v1alpha1/weather/weather_service.swagger.json @@ -16,6 +16,42 @@ "application/json" ], "paths": { + "/v1/count": { + "get": { + "operationId": "AmbientLocalWeatherService_CountWeatherUpdates", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/weatherCountWeatherUpdatesResponse" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "opts.stationName", + "in": "query", + "required": false, + "type": "string" + }, + { + "name": "opts.stationType", + "in": "query", + "required": false, + "type": "string" + } + ], + "tags": [ + "AmbientLocalWeatherService" + ] + } + }, "/v1/weather": { "get": { "operationId": "AmbientLocalWeatherService_GetWeather", @@ -102,6 +138,15 @@ }, "title": "Represents battery status for different components" }, + "weatherCountWeatherUpdatesResponse": { + "type": "object", + "properties": { + "count": { + "type": "integer", + "format": "int32" + } + } + }, "weatherGetWeatherOpts": { "type": "object", "properties": { diff --git a/api/v1alpha1/weather/weather_service_grpc.pb.go b/api/v1alpha1/weather/weather_service_grpc.pb.go index 2224d4b..3f2accb 100644 --- a/api/v1alpha1/weather/weather_service_grpc.pb.go +++ b/api/v1alpha1/weather/weather_service_grpc.pb.go @@ -19,7 +19,8 @@ import ( const _ = grpc.SupportPackageIsVersion9 const ( - AmbientLocalWeatherService_GetWeather_FullMethodName = "/ambient.weather.AmbientLocalWeatherService/GetWeather" + AmbientLocalWeatherService_GetWeather_FullMethodName = "/ambient.weather.AmbientLocalWeatherService/GetWeather" + AmbientLocalWeatherService_CountWeatherUpdates_FullMethodName = "/ambient.weather.AmbientLocalWeatherService/CountWeatherUpdates" ) // AmbientLocalWeatherServiceClient is the client API for AmbientLocalWeatherService service. @@ -27,6 +28,7 @@ const ( // For semantics around ctx use and closing/ending streaming RPCs, please refer to https://pkg.go.dev/google.golang.org/grpc/?tab=doc#ClientConn.NewStream. type AmbientLocalWeatherServiceClient interface { GetWeather(ctx context.Context, in *GetWeatherRequest, opts ...grpc.CallOption) (*GetWeatherResponse, error) + CountWeatherUpdates(ctx context.Context, in *CountWeatherUpdatesRequest, opts ...grpc.CallOption) (*CountWeatherUpdatesResponse, error) } type ambientLocalWeatherServiceClient struct { @@ -47,11 +49,22 @@ func (c *ambientLocalWeatherServiceClient) GetWeather(ctx context.Context, in *G return out, nil } +func (c *ambientLocalWeatherServiceClient) CountWeatherUpdates(ctx context.Context, in *CountWeatherUpdatesRequest, opts ...grpc.CallOption) (*CountWeatherUpdatesResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(CountWeatherUpdatesResponse) + err := c.cc.Invoke(ctx, AmbientLocalWeatherService_CountWeatherUpdates_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + // AmbientLocalWeatherServiceServer is the server API for AmbientLocalWeatherService service. // All implementations must embed UnimplementedAmbientLocalWeatherServiceServer // for forward compatibility. type AmbientLocalWeatherServiceServer interface { GetWeather(context.Context, *GetWeatherRequest) (*GetWeatherResponse, error) + CountWeatherUpdates(context.Context, *CountWeatherUpdatesRequest) (*CountWeatherUpdatesResponse, error) mustEmbedUnimplementedAmbientLocalWeatherServiceServer() } @@ -65,6 +78,9 @@ type UnimplementedAmbientLocalWeatherServiceServer struct{} func (UnimplementedAmbientLocalWeatherServiceServer) GetWeather(context.Context, *GetWeatherRequest) (*GetWeatherResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetWeather not implemented") } +func (UnimplementedAmbientLocalWeatherServiceServer) CountWeatherUpdates(context.Context, *CountWeatherUpdatesRequest) (*CountWeatherUpdatesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method CountWeatherUpdates not implemented") +} func (UnimplementedAmbientLocalWeatherServiceServer) mustEmbedUnimplementedAmbientLocalWeatherServiceServer() { } func (UnimplementedAmbientLocalWeatherServiceServer) testEmbeddedByValue() {} @@ -105,6 +121,24 @@ func _AmbientLocalWeatherService_GetWeather_Handler(srv interface{}, ctx context return interceptor(ctx, in, info, handler) } +func _AmbientLocalWeatherService_CountWeatherUpdates_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CountWeatherUpdatesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AmbientLocalWeatherServiceServer).CountWeatherUpdates(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AmbientLocalWeatherService_CountWeatherUpdates_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AmbientLocalWeatherServiceServer).CountWeatherUpdates(ctx, req.(*CountWeatherUpdatesRequest)) + } + return interceptor(ctx, in, info, handler) +} + // AmbientLocalWeatherService_ServiceDesc is the grpc.ServiceDesc for AmbientLocalWeatherService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -116,6 +150,10 @@ var AmbientLocalWeatherService_ServiceDesc = grpc.ServiceDesc{ MethodName: "GetWeather", Handler: _AmbientLocalWeatherService_GetWeather_Handler, }, + { + MethodName: "CountWeatherUpdates", + Handler: _AmbientLocalWeatherService_CountWeatherUpdates_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "weather/weather_service.proto", diff --git a/pkg/ambient/ambientgrpc/grpc.go b/pkg/ambient/ambientgrpc/grpc.go index f144f1d..192ae7e 100644 --- a/pkg/ambient/ambientgrpc/grpc.go +++ b/pkg/ambient/ambientgrpc/grpc.go @@ -9,6 +9,7 @@ import ( "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "google.golang.org/protobuf/types/known/timestamppb" + "k8s.io/utils/ptr" "gitea.libretechconsulting.com/rmcguire/go-app/pkg/otel" @@ -31,6 +32,27 @@ func NewGRPCWeather(ctx context.Context, recorder *recorder.WeatherRecorder) *GR } } +func (w *GRPCWeather) CountWeatherUpdates(ctx context.Context, req *pb.CountWeatherUpdatesRequest) ( + *pb.CountWeatherUpdatesResponse, error, +) { + if req.Opts == nil { + count := w.recorder.Count(ctx) + return &pb.CountWeatherUpdatesResponse{Count: int32(count)}, nil + } + + resp, err := w.GetWeather(ctx, &pb.GetWeatherRequest{ + Opts: req.Opts, + Limit: ptr.To(int32(-1)), + }) + if err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } + + return &pb.CountWeatherUpdatesResponse{ + Count: int32(len(resp.WeatherUpdates)), + }, nil +} + func (w *GRPCWeather) GetWeather(ctx context.Context, req *pb.GetWeatherRequest) ( *pb.GetWeatherResponse, error, ) { diff --git a/pkg/util/util.go b/pkg/util/util.go index 2d64a28..780934f 100644 --- a/pkg/util/util.go +++ b/pkg/util/util.go @@ -75,7 +75,12 @@ func ApplyOptsToUpdates(updates []*weather.WeatherUpdate, limit int, opts *pb.Ge return updates } - filtered := make([]*weather.WeatherUpdate, 0, limit) + capacity := len(updates) + if limit > 0 { + capacity = limit + } + + filtered := make([]*weather.WeatherUpdate, 0, capacity) for i := len(updates) - 1; i >= 0; i-- { update := updates[i] diff --git a/proto/weather/weather.proto b/proto/weather/weather.proto index cb1f26f..532931c 100644 --- a/proto/weather/weather.proto +++ b/proto/weather/weather.proto @@ -5,6 +5,14 @@ import "google/protobuf/timestamp.proto"; option go_package = "gitea.libretechconsulting.com/rmcguire/ambient-local-exporter/api/v1alpha1/weather"; +message CountWeatherUpdatesRequest { + GetWeatherOpts opts = 1; +} + +message CountWeatherUpdatesResponse { + int32 count = 1; +} + message GetWeatherRequest { GetWeatherOpts opts = 1; optional int32 limit = 2; diff --git a/proto/weather/weather_service.proto b/proto/weather/weather_service.proto index 9175edf..2a889a0 100644 --- a/proto/weather/weather_service.proto +++ b/proto/weather/weather_service.proto @@ -10,4 +10,7 @@ service AmbientLocalWeatherService { rpc GetWeather(GetWeatherRequest) returns (GetWeatherResponse) { option (google.api.http) = {get: "/v1/weather"}; } + rpc CountWeatherUpdates(CountWeatherUpdatesRequest) returns (CountWeatherUpdatesResponse) { + option (google.api.http) = {get: "/v1/count"}; + } }