You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							144 lines
						
					
					
						
							3.1 KiB
						
					
					
				
			
		
		
		
			
			
			
				
					
				
				
					
				
			
		
		
	
	
							144 lines
						
					
					
						
							3.1 KiB
						
					
					
				| package api | |
| 
 | |
| import ( | |
| 	"fmt" | |
| 	"git.aiterp.net/lucifer/new-server/app/config" | |
| 	"git.aiterp.net/lucifer/new-server/models" | |
| 	"github.com/gin-gonic/gin" | |
| 	"log" | |
| 	"time" | |
| ) | |
| 
 | |
| func Bridges(r gin.IRoutes) { | |
| 	r.GET("", handler(func(c *gin.Context) (interface{}, error) { | |
| 		return config.BridgeRepository().FetchAll(ctxOf(c)) | |
| 	})) | |
| 
 | |
| 	r.GET("/:id", handler(func(c *gin.Context) (interface{}, error) { | |
| 		return config.BridgeRepository().Find(ctxOf(c), intParam(c, "id")) | |
| 	})) | |
| 
 | |
| 	r.POST("", handler(func(c *gin.Context) (interface{}, error) { | |
| 		var body struct { | |
| 			Driver    models.DriverKind `json:"driver"` | |
| 			Address   string            `json:"address"` | |
| 			Token     string            `json:"token"` | |
| 			ForceSave bool              `json:"forceSave"` | |
| 			DryRun    bool              `json:"dryRun"` | |
| 		} | |
| 		err := parseBody(c, &body) | |
| 		if err != nil { | |
| 			return nil, err | |
| 		} | |
| 
 | |
| 		driver, err := config.DriverProvider().Provide(body.Driver) | |
| 		if err != nil { | |
| 			return nil, err | |
| 		} | |
| 
 | |
| 		if body.ForceSave { | |
| 			bridge := models.Bridge{ | |
| 				Name:    fmt.Sprintf("Manually saved %s bridge (%s)", body.Driver, body.Address), | |
| 				Driver:  body.Driver, | |
| 				Address: body.Address, | |
| 				Token:   body.Token, | |
| 			} | |
| 
 | |
| 			err := config.BridgeRepository().Save(ctxOf(c), &bridge) | |
| 			if err != nil { | |
| 				return nil, err | |
| 			} | |
| 
 | |
| 			return []models.Bridge{bridge}, nil | |
| 		} | |
| 
 | |
| 		bridges, err := driver.SearchBridge(ctxOf(c), body.Address, body.DryRun) | |
| 		if err != nil { | |
| 			return nil, err | |
| 		} | |
| 
 | |
| 		if !body.DryRun { | |
| 			for _, bridge := range bridges { | |
| 				err := config.BridgeRepository().Save(ctxOf(c), &bridge) | |
| 				if err != nil { | |
| 					return nil, err | |
| 				} | |
| 
 | |
| 				log.Printf("Saved new bridge: %s (%s)", bridge.Name, bridge.Address) | |
| 			} | |
| 		} | |
| 
 | |
| 		return bridges, nil | |
| 	})) | |
| 
 | |
| 	r.PUT("/:id", handler(func(c *gin.Context) (interface{}, error) { | |
| 		var body struct { | |
| 			Name *string `json:"name"` | |
| 		} | |
| 		err := parseBody(c, &body) | |
| 		if err != nil { | |
| 			return nil, err | |
| 		} | |
| 
 | |
| 		bridge, err := config.BridgeRepository().Find(ctxOf(c), intParam(c, "id")) | |
| 		if err != nil { | |
| 			return nil, err | |
| 		} | |
| 
 | |
| 		if body.Name != nil { | |
| 			bridge.Name = *body.Name | |
| 		} | |
| 
 | |
| 		err = config.BridgeRepository().Save(ctxOf(c), &bridge) | |
| 		if err != nil { | |
| 			return nil, err | |
| 		} | |
| 
 | |
| 		return bridge, nil | |
| 	})) | |
| 
 | |
| 	r.PUT("/:id/search", handler(func(c *gin.Context) (interface{}, error) { | |
| 		var body struct { | |
| 			TimeoutMS int64 `json:"timeoutMs"` | |
| 		} | |
| 		err := parseBody(c, &body) | |
| 		if err != nil { | |
| 			return nil, err | |
| 		} | |
| 
 | |
| 		if body.TimeoutMS <= 0 { | |
| 			body.TimeoutMS = 30000 | |
| 		} | |
| 
 | |
| 		bridge, err := config.BridgeRepository().Find(ctxOf(c), intParam(c, "id")) | |
| 		if err != nil { | |
| 			return nil, err | |
| 		} | |
| 
 | |
| 		driver, err := config.DriverProvider().Provide(bridge.Driver) | |
| 		if err != nil { | |
| 			return nil, err | |
| 		} | |
| 
 | |
| 		devices, err := driver.SearchDevices(ctxOf(c), bridge, time.Millisecond * time.Duration(body.TimeoutMS)) | |
| 		if err != nil { | |
| 			return nil, err | |
| 		} | |
| 
 | |
| 		return devices, nil | |
| 	})) | |
| 
 | |
| 	r.DELETE("/:id", handler(func(c *gin.Context) (interface{}, error) { | |
| 		bridge, err := config.BridgeRepository().Find(ctxOf(c), intParam(c, "id")) | |
| 		if err != nil { | |
| 			return nil, err | |
| 		} | |
| 
 | |
| 		err = config.BridgeRepository().Delete(ctxOf(c), &bridge) | |
| 		if err != nil { | |
| 			return nil, err | |
| 		} | |
| 
 | |
| 		return bridge, nil | |
| 	})) | |
| }
 |