add: sensors

This commit is contained in:
Charles Hathaway
2023-10-01 22:02:30 -07:00
parent a07a993bab
commit ac4e32697c
13 changed files with 1247 additions and 191 deletions
+65
View File
@@ -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 {