diff --git a/api/user-service/openapi.yaml b/api/user-service/openapi.yaml index 0fe18f0..feb76ee 100644 --- a/api/user-service/openapi.yaml +++ b/api/user-service/openapi.yaml @@ -74,7 +74,27 @@ paths: "500": description: Internal server error $ref: "#/components/responses/BadResponse" - + /event/local_storage/{serial}: + delete: + summary: Delete an event + description: Delete an event + operationId: deleteEventBySerial + tags: + - event + parameters: + - $ref: "#/components/parameters/serial" + responses: + "200": + description: Event deleted + $ref: "#/components/responses/OKResponse" + "401": + description: Event not found + "404": + description: Event not found + $ref: "#/components/responses/ResponseNotFound" + "500": + $ref: "#/components/responses/BadResponse" + description: Internal server error components: securitySchemes: access_token: @@ -82,6 +102,14 @@ components: in: header name: Authorization parameters: + serial: + name: serial + in: path + description: Serial of the local storage + required: true + schema: + type: string + example: "1234567890" event_uuid: name: event_uuid in: path @@ -92,6 +120,13 @@ components: format: uuid example: 123e4567-e89b-12d3-a456-426655440000 responses: + OKResponse: + description: OK + content: + application/json: + schema: + type: object + $ref: "#/components/schemas/BaseResponse" DeleteEventOK: description: Event deleted content: diff --git a/build/sysroot/usr/lib/systemd/system/casaos-user-service.service b/build/sysroot/usr/lib/systemd/system/casaos-user-service.service index 41f6325..45a16d1 100644 --- a/build/sysroot/usr/lib/systemd/system/casaos-user-service.service +++ b/build/sysroot/usr/lib/systemd/system/casaos-user-service.service @@ -1,5 +1,7 @@ [Unit] After=casaos-gateway.service +After=casaos-message-bus.service +After=casaos-local-storage.service ConditionFileNotEmpty=/etc/casaos/user-service.conf Description=CasaOS User Service diff --git a/route/event_listen.go b/route/event_listen.go index 1ac688a..d6f559a 100644 --- a/route/event_listen.go +++ b/route/event_listen.go @@ -5,6 +5,7 @@ import ( "fmt" "log" "strings" + "time" "github.com/IceWhaleTech/CasaOS-Common/external" "github.com/IceWhaleTech/CasaOS-Common/utils/logger" @@ -17,49 +18,53 @@ import ( ) func EventListen() { + for i := 0; i < 100; i++ { - messageBusUrl, err := external.GetMessageBusAddress(config.CommonInfo.RuntimePath) - if err != nil { - logger.Error("get message bus url error", zap.Any("err", err)) - return - } - - wsURL := fmt.Sprintf("ws://%s/event/%s", strings.ReplaceAll(messageBusUrl, "http://", ""), "local-storage") - ws, err := websocket.Dial(wsURL, "", "http://localhost") - if err != nil { - logger.Error("connect websocket err", zap.Any("error", err)) - } - defer ws.Close() - - log.Println("subscribed to", wsURL) - for { - - msg := make([]byte, 1024) - n, err := ws.Read(msg) + messageBusUrl, err := external.GetMessageBusAddress(config.CommonInfo.RuntimePath) if err != nil { - log.Fatalln(err.Error()) + logger.Error("get message bus url error", zap.Any("err", err)) + return } - var event message_bus.Event - - if err := json.Unmarshal(msg[:n], &event); err != nil { - log.Println(err.Error()) - } - propertiesStr, err := json.Marshal(event.Properties) + wsURL := fmt.Sprintf("ws://%s/event/%s", strings.ReplaceAll(messageBusUrl, "http://", ""), "local-storage") + ws, err := websocket.Dial(wsURL, "", "http://localhost") if err != nil { + logger.Error("connect websocket err", zap.Any("error", err)) + time.Sleep(time.Second * 5) continue } - model := model.EventModel{ - SourceID: event.SourceID, - Name: event.Name, - Properties: string(propertiesStr), - UUID: *event.Uuid, + defer ws.Close() + + log.Println("subscribed to", wsURL) + for { + + msg := make([]byte, 1024) + n, err := ws.Read(msg) + if err != nil { + log.Fatalln(err.Error()) + } + + var event message_bus.Event + + if err := json.Unmarshal(msg[:n], &event); err != nil { + log.Println(err.Error()) + } + propertiesStr, err := json.Marshal(event.Properties) + if err != nil { + continue + } + model := model.EventModel{ + SourceID: event.SourceID, + Name: event.Name, + Properties: string(propertiesStr), + UUID: *event.Uuid, + } + service.MyService.Event().CreateEvemt(model) + output, err := json.MarshalIndent(event, "", " ") + if err != nil { + log.Println(err.Error()) + } + log.Println(string(output)) } - service.MyService.Event().CreateEvemt(model) - output, err := json.MarshalIndent(event, "", " ") - if err != nil { - log.Println(err.Error()) - } - log.Println(string(output)) } } diff --git a/route/v2/api_route_event.go b/route/v2/api_route_event.go index 87868af..78db94f 100644 --- a/route/v2/api_route_event.go +++ b/route/v2/api_route_event.go @@ -18,3 +18,7 @@ func (s *UserService) GetEvents(ctx echo.Context, params codegen.GetEventsParams list := service.MyService.Event().GetEvents() return ctx.JSON(http.StatusOK, list) } +func (s *UserService) DeleteEventBySerial(ctx echo.Context, serial codegen.Serial) error { + service.MyService.Event().DeleteEventBySerial(serial) + return ctx.JSON(http.StatusOK, serial) +} diff --git a/service/event.go b/service/event.go index 947e147..8b45ba7 100644 --- a/service/event.go +++ b/service/event.go @@ -1,6 +1,8 @@ package service import ( + "encoding/json" + "github.com/IceWhaleTech/CasaOS-UserService/model" "gorm.io/gorm" ) @@ -10,6 +12,7 @@ type EventService interface { GetEvents() (list []model.EventModel) GetEventByUUID(uuid string) (m model.EventModel) DeleteEvent(uuid string) + DeleteEventBySerial(serial string) } type eventService struct { @@ -31,7 +34,23 @@ func (e *eventService) GetEventByUUID(uuid string) (m model.EventModel) { func (e *eventService) DeleteEvent(uuid string) { e.db.Where("uuid = ?", uuid).Delete(&model.EventModel{}) } +func (e *eventService) DeleteEventBySerial(serial string) { + list := []model.EventModel{} + e.db.Find(&list) + for _, v := range list { + if v.SourceID == "local-storage" { + properties := make(map[string]string) + err := json.Unmarshal([]byte(v.Properties), &properties) + if err != nil { + continue + } + if properties["serial"] == serial { + e.db.Delete(&v) + } + } + } +} func NewEventService(db *gorm.DB) EventService { return &eventService{db: db} }