Skip to content

Commit 9d8410b

Browse files
committed
2 parents 624c624 + c8426e3 commit 9d8410b

File tree

8 files changed

+121
-37
lines changed

8 files changed

+121
-37
lines changed

DBPacth/v1.0.1-v1.0.2.sql

+2
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
ALTER TABLE `package`
2+
ADD COLUMN `deployment_version_id` INT NULL AFTER `deployment_id`;

README.md

-5
Original file line numberDiff line numberDiff line change
@@ -120,10 +120,5 @@ chmod +x code-push-go
120120
<string moduleConfig="true" name="CodePushServerUrl">${CODE_PUSH_SERVER_URL}</string>
121121
```
122122

123-
## Developing
124-
- [X] Delete app
125-
- [X] Delete deployment
126-
- [ ] Rollback bundel
127-
128123
## License
129124
MIT License [Read](https://github.com/htdcx/code-push-server-go/blob/main/LICENSE)

code-push.sql

+1
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ DROP TABLE IF EXISTS `package`;
109109
CREATE TABLE `package` (
110110
`id` int NOT NULL AUTO_INCREMENT,
111111
`deployment_id` int DEFAULT NULL,
112+
`deployment_version_id` int DEFAULT NULL,
112113
`size` bigint DEFAULT NULL,
113114
`hash` varchar(256) DEFAULT NULL,
114115
`description` TEXT DEFAULT NULL,

main.go

+1
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ func main() {
3939
authApi.POST("/lsDeployment", request.App{}.LsDeployment)
4040
authApi.GET("/lsApp", request.App{}.LsApp)
4141
authApi.POST("/uploadBundle", request.App{}.UploadBundle)
42+
authApi.POST("/rollback", request.App{}.Rollback)
4243
}
4344

4445
g.Run(configs.Port)

model/deploymentVersion.go

+4
Original file line numberDiff line numberDiff line change
@@ -31,3 +31,7 @@ func (DeploymentVersion) GetNewVersionByKeyDeploymentId(deploymentId int) *Deplo
3131
}
3232
return deploymentVersion
3333
}
34+
35+
func (DeploymentVersion) UpdateCurrentPackage(id int, pid *int) {
36+
userDb.Raw("update deployment_version set current_package=? where id=?", pid, id).Scan(&DeploymentVersion{})
37+
}

model/package.go

+20-10
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,17 @@
11
package model
22

33
type Package struct {
4-
Id *int `gorm:"primarykey;autoIncrement;size:32"`
5-
DeploymentId *int `json:"deploymentId"`
6-
Size *int64 `json:"size"`
7-
Hash *string `json:"hash"`
8-
Download *string `json:"download"`
9-
Active *int `json:"active"`
10-
Failed *int `json:"failed"`
11-
Installed *int `json:"installed"`
12-
CreateTime *int64 `json:"create_time"`
13-
Description *string `json:"description"`
4+
Id *int `gorm:"primarykey;autoIncrement;size:32"`
5+
DeploymentId *int `json:"deploymentId"`
6+
DeploymentVersionId *int `json:"deploymentVersionId"`
7+
Size *int64 `json:"size"`
8+
Hash *string `json:"hash"`
9+
Download *string `json:"download"`
10+
Active *int `json:"active"`
11+
Failed *int `json:"failed"`
12+
Installed *int `json:"installed"`
13+
CreateTime *int64 `json:"create_time"`
14+
Description *string `json:"description"`
1415
}
1516

1617
func (Package) TableName() string {
@@ -28,3 +29,12 @@ func (Package) AddFailed(pid int) {
2829
func (Package) AddInstalled(pid int) {
2930
userDb.Raw("update package set installed=installed+1 where id=?", pid).Scan(&Package{})
3031
}
32+
33+
func (Package) GetRollbackPack(deploymentId int, lastPakcId int, deploymentVersionId int) *Package {
34+
var lastPackage *Package
35+
err := userDb.Where("deployment_id=?", deploymentId).Where("id<?", lastPakcId).Where("deployment_version_id", deploymentVersionId).Order("id desc").First(&lastPackage).Error
36+
if err != nil {
37+
return nil
38+
}
39+
return lastPackage
40+
}

request/app.go

+76-9
Original file line numberDiff line numberDiff line change
@@ -111,15 +111,16 @@ func (App) CreateBundle(ctx *gin.Context) {
111111
// uuid, _ := uuid.NewUUID()
112112
// hash := uuid.String()
113113
newPackage := model.Package{
114-
DeploymentId: deployment.Id,
115-
Size: createBundleReq.Size,
116-
Hash: createBundleReq.Hash,
117-
Download: createBundleReq.DownloadUrl,
118-
Description: createBundleReq.Description,
119-
Active: utils.CreateInt(0),
120-
Installed: utils.CreateInt(0),
121-
Failed: utils.CreateInt(0),
122-
CreateTime: utils.GetTimeNow(),
114+
DeploymentId: deployment.Id,
115+
DeploymentVersionId: deploymentVersion.Id,
116+
Size: createBundleReq.Size,
117+
Hash: createBundleReq.Hash,
118+
Download: createBundleReq.DownloadUrl,
119+
Description: createBundleReq.Description,
120+
Active: utils.CreateInt(0),
121+
Installed: utils.CreateInt(0),
122+
Failed: utils.CreateInt(0),
123+
CreateTime: utils.GetTimeNow(),
123124
}
124125
model.Create[model.Package](&newPackage)
125126
deploymentVersion.CurrentPackage = newPackage.Id
@@ -423,3 +424,69 @@ func (App) DelDeployment(ctx *gin.Context) {
423424
log.Panic(err.Error())
424425
}
425426
}
427+
428+
type rollbackReq struct {
429+
AppName *string `json:"appName" binding:"required"`
430+
Deployment *string `json:"deployment" binding:"required"`
431+
Version *string `json:"version"`
432+
}
433+
434+
func (App) Rollback(ctx *gin.Context) {
435+
rollbackReq := rollbackReq{}
436+
if err := ctx.ShouldBindBodyWith(&rollbackReq, binding.JSON); err == nil {
437+
uid := ctx.MustGet(constants.GIN_USER_ID).(int)
438+
439+
app := model.App{}.GetAppByUidAndAppName(uid, *rollbackReq.AppName)
440+
if app == nil {
441+
log.Panic("App not found")
442+
}
443+
deployment := model.Deployment{}.GetByAppidAndName(*app.Id, *rollbackReq.Deployment)
444+
if deployment == nil {
445+
log.Panic("Deployment " + *rollbackReq.Deployment + " not found")
446+
}
447+
448+
var deploymentVersion *model.DeploymentVersion
449+
if deployment.VersionId != nil {
450+
deploymentVersion = model.DeploymentVersion{}.GetByKeyDeploymentIdAndVersion(*deployment.Id, *rollbackReq.Version)
451+
}
452+
if deploymentVersion == nil {
453+
log.Panic("Version not found")
454+
}
455+
if deploymentVersion.CurrentPackage == nil {
456+
log.Panic("There is no upload package for the current version")
457+
}
458+
newPackage := model.Package{}.GetRollbackPack(*deployment.Id, *deploymentVersion.CurrentPackage, *deploymentVersion.Id)
459+
460+
userDb, _ := db.GetUserDB()
461+
err := userDb.Transaction(func(tx *gorm.DB) error {
462+
if newPackage == nil {
463+
model.DeploymentVersion{}.UpdateCurrentPackage(*deploymentVersion.Id, nil)
464+
} else {
465+
model.DeploymentVersion{}.UpdateCurrentPackage(*deploymentVersion.Id, newPackage.Id)
466+
}
467+
return nil
468+
})
469+
if err != nil {
470+
panic("RollbackError:" + err.Error())
471+
}
472+
473+
if newPackage != nil {
474+
ctx.JSON(http.StatusOK, gin.H{
475+
"Success": true,
476+
"Version": *deploymentVersion.AppVersion,
477+
"PackId": *newPackage.Id,
478+
"Size": *newPackage.Size,
479+
"Hash": *newPackage.Hash,
480+
"CreateTime": *newPackage.CreateTime,
481+
})
482+
} else {
483+
ctx.JSON(http.StatusOK, gin.H{
484+
"Success": true,
485+
"Version": *deploymentVersion.AppVersion,
486+
})
487+
}
488+
redis.DelRedisObj(constants.REDIS_UPDATE_INFO + *deployment.Key + "*")
489+
} else {
490+
log.Panic(err.Error())
491+
}
492+
}

request/client.go

+17-13
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ import (
1515

1616
type Client struct{}
1717
type updateInfo struct {
18-
DownloadUrl string `json:"download_url"`
18+
DownloadUrl string `json:"download_url"`
1919
Description string `json:"description"`
2020
IsAvailable bool `json:"is_available"`
2121
IsDisabled bool `json:"is_disabled"`
@@ -51,18 +51,22 @@ func (Client) CheckUpdate(ctx *gin.Context) {
5151
}
5252
deploymentVersion := model.DeploymentVersion{}.GetByKeyDeploymentIdAndVersion(*deployment.Id, appVersion)
5353
if deploymentVersion != nil {
54-
packag := model.GetOne[model.Package]("id", deploymentVersion.CurrentPackage)
55-
if packag != nil {
56-
// && *packag.Hash != packageHash
57-
updateInfoRedis.TargetBinaryRange = *deploymentVersion.AppVersion
58-
updateInfoRedis.PackageHash = *packag.Hash
59-
updateInfoRedis.PackageSize = *packag.Size
60-
updateInfoRedis.IsAvailable = true
61-
updateInfoRedis.IsMandatory = true
62-
label := strconv.Itoa(*packag.Id)
63-
updateInfoRedis.Label = label
64-
updateInfoRedis.DownloadUrl = config.ResourceUrl + *packag.Download
65-
updateInfoRedis.Description = *packag.Description
54+
if deploymentVersion.CurrentPackage != nil {
55+
packag := model.GetOne[model.Package]("id", deploymentVersion.CurrentPackage)
56+
if packag != nil {
57+
// && *packag.Hash != packageHash
58+
updateInfoRedis.TargetBinaryRange = *deploymentVersion.AppVersion
59+
updateInfoRedis.PackageHash = *packag.Hash
60+
updateInfoRedis.PackageSize = *packag.Size
61+
updateInfoRedis.IsAvailable = true
62+
updateInfoRedis.IsMandatory = true
63+
label := strconv.Itoa(*packag.Id)
64+
updateInfoRedis.Label = label
65+
updateInfoRedis.DownloadUrl = config.ResourceUrl + *packag.Download
66+
if packag.Description != nil {
67+
updateInfoRedis.Description = *packag.Description
68+
}
69+
}
6670
}
6771
}
6872
deploymentVersionNew := model.DeploymentVersion{}.GetNewVersionByKeyDeploymentId(*deployment.Id)

0 commit comments

Comments
 (0)