Utility APIs for app version management.
All checks were successful
continuous-integration/drone Build is passing

* GETing individual app versions.
* DELETEing individual app versions.

Fix #3
This commit is contained in:
zegkljan 2022-10-02 16:31:13 +02:00
parent f9850c3264
commit 90f8fef40a
3 changed files with 79 additions and 0 deletions

View File

@ -6,6 +6,7 @@ const (
URIHardFail = "/hard-fail"
URISoftFail = "/soft-fail"
URIAppVersions = "/app-versions"
URIAppVersion = "/app-versions/:version"
URIReinit = "/reinit"
URIMapPack = "/mappack"
URIHandshake = "/handshake"

View File

@ -115,6 +115,8 @@ func (s *Server) setupRouter() *gin.Engine {
})
router.GET(URIAppVersions, s.handleGETAppVersions)
router.POST(URIAppVersions, s.handlePOSTAppVersions)
router.GET(URIAppVersion, s.handleGETAppVersion)
router.DELETE(URIAppVersion, s.handleDELETEAppVersion)
router.POST(URIReinit, s.handlePOSTReset)
return router
@ -179,6 +181,44 @@ func (s *Server) handlePOSTAppVersions(gc *gin.Context) {
gc.Status(http.StatusNoContent)
}
func (s *Server) handleGETAppVersion(gc *gin.Context) {
version := gc.Param("version")
if version == "" {
badRequest(gc, fmt.Errorf("version not provided"))
return
}
ver, err := s.getAppVersion(version)
if err != nil {
internalError(gc, err)
return
}
if ver == nil {
gc.Status(http.StatusNotFound)
return
}
gc.JSON(http.StatusOK, ver)
}
func (s *Server) handleDELETEAppVersion(gc *gin.Context) {
version := gc.Param("version")
if version == "" {
badRequest(gc, fmt.Errorf("version not provided"))
return
}
deleted, err := s.deleteAppVersion(version)
if err != nil {
internalError(gc, err)
return
}
if !deleted {
gc.Status(http.StatusNotFound)
return
}
gc.Status(http.StatusNoContent)
}
func (s *Server) handlePOSTReset(gc *gin.Context) {
err := s.initDB(true)
if err != nil {

View File

@ -434,6 +434,44 @@ func (s *Server) putAppVersion(versionInfo *models.AppVersionInfo) error {
return nil
}
func (s *Server) getAppVersion(version string) (*models.AppVersionInfo, error) {
conn := s.getDbConn()
defer s.dbpool.Put(conn)
var v *models.AppVersionInfo
err := sqlitex.Exec(conn, "select version, address from app_versions where version = ?", func(stmt *sqlite.Stmt) error {
verStr := stmt.ColumnText(0)
ver, err := semver.NewVersion(verStr)
if err != nil {
return fmt.Errorf("failed to parse version string %s from db: %w", verStr, err)
}
addr := stmt.ColumnText(1)
v = &models.AppVersionInfo{
Version: *ver,
Address: addr,
}
return nil
}, version)
if err != nil {
return nil, fmt.Errorf("failed to retrieve app version %s from db: %w", version, err)
}
return v, nil
}
func (s *Server) deleteAppVersion(version string) (bool, error) {
conn := s.getDbConn()
defer s.dbpool.Put(conn)
err := sqlitex.Exec(conn, "delete from app_versions where version = ?", nil, version)
if err != nil {
return false, fmt.Errorf("failed to delete app version %s from db: %w", version, err)
}
n := conn.Changes()
return n > 0, nil
}
func (s *Server) handshake(hc models.HandshakeChallenge) (models.UserID, error) {
conn := s.getDbConn()
defer s.dbpool.Put(conn)