add: sensors
This commit is contained in:
@@ -37,6 +37,9 @@ type Server struct {
|
||||
|
||||
sessionsByCamera map[string]chan *session
|
||||
sessionsById map[string]*session
|
||||
|
||||
// Most recent sample
|
||||
samplesByCamera map[string]map[pb.Sample_Type]*pb.Sample
|
||||
}
|
||||
|
||||
func New() *Server {
|
||||
@@ -44,6 +47,7 @@ func New() *Server {
|
||||
camerasByHome: make(map[string]map[string]*camera),
|
||||
sessionsByCamera: make(map[string]chan *session),
|
||||
sessionsById: make(map[string]*session),
|
||||
samplesByCamera: make(map[string]map[pb.Sample_Type]*pb.Sample),
|
||||
}
|
||||
go s.cleanup()
|
||||
return s
|
||||
@@ -160,9 +164,11 @@ func (s *Server) PopSession(ctx context.Context, request *connect.Request[pb.Pop
|
||||
s.mu.Lock()
|
||||
|
||||
if _, ok := s.camerasByHome[authToken.Home]; !ok {
|
||||
s.mu.Unlock()
|
||||
return nil, status.Errorf(codes.NotFound, "home %q not found", authToken.Home)
|
||||
}
|
||||
if _, ok := s.camerasByHome[authToken.Home][authToken.Uid]; !ok {
|
||||
s.mu.Unlock()
|
||||
return nil, status.Errorf(codes.Unauthenticated, "you are not a camera")
|
||||
}
|
||||
|
||||
@@ -238,6 +244,65 @@ func (s *Server) PopIceMessage(ctx context.Context, request *connect.Request[pb.
|
||||
return connect.NewResponse(msg), nil
|
||||
}
|
||||
|
||||
func (s *Server) CreateSample(ctx context.Context, request *connect.Request[pb.CreateSampleRequest]) (*connect.Response[pb.Sample], error) {
|
||||
authToken, err := getAuthToken(request)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
s.mu.Lock()
|
||||
defer s.mu.Unlock()
|
||||
|
||||
if _, ok := s.camerasByHome[authToken.Home]; !ok {
|
||||
return nil, status.Errorf(codes.NotFound, "home %q not found", authToken.Home)
|
||||
}
|
||||
cam, ok := s.camerasByHome[authToken.Home][authToken.Uid]
|
||||
if !ok {
|
||||
return nil, status.Errorf(codes.Unauthenticated, "you are not a camera")
|
||||
}
|
||||
|
||||
if _, ok := s.samplesByCamera[authToken.Uid]; !ok {
|
||||
s.samplesByCamera[authToken.Uid] = make(map[pb.Sample_Type]*pb.Sample)
|
||||
}
|
||||
|
||||
sample := request.Msg.GetSample()
|
||||
s.samplesByCamera[authToken.Uid][sample.Type] = &pb.Sample{
|
||||
Type: sample.Type,
|
||||
Reading: sample.Reading,
|
||||
|
||||
CameraId: &pb.Camera_Identifier{
|
||||
Id: cam.id,
|
||||
},
|
||||
}
|
||||
return connect.NewResponse(s.samplesByCamera[authToken.Uid][sample.Type]), nil
|
||||
}
|
||||
|
||||
func (s *Server) ListSamples(ctx context.Context, request *connect.Request[pb.ListSamplesRequest]) (*connect.Response[pb.ListSamplesResponse], error) {
|
||||
authToken, err := getAuthToken(request)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
s.mu.Lock()
|
||||
defer s.mu.Unlock()
|
||||
|
||||
if _, ok := s.camerasByHome[authToken.Home]; !ok {
|
||||
return nil, status.Errorf(codes.NotFound, "home %q not found", authToken.Home)
|
||||
}
|
||||
|
||||
var samples []*pb.Sample
|
||||
for camera := range s.camerasByHome[authToken.Home] {
|
||||
if sample, ok := s.samplesByCamera[camera]; ok {
|
||||
for _, sample := range sample {
|
||||
samples = append(samples, sample)
|
||||
}
|
||||
}
|
||||
}
|
||||
return connect.NewResponse(&pb.ListSamplesResponse{
|
||||
Samples: samples,
|
||||
}), nil
|
||||
}
|
||||
|
||||
func (s *Server) cleanup() {
|
||||
ticker := time.NewTicker(time.Minute * 5)
|
||||
for t := range ticker.C {
|
||||
|
||||
Reference in New Issue
Block a user