fix: resolve all compile errors in licensing endpoints #662
@@ -113,7 +113,8 @@ func ServeDownload(ctx *context.APIContext) {
|
||||
}
|
||||
|
||||
// Find ZIP attachment
|
||||
attachments, err := repo_model.GetAttachmentsByReleaseID(ctx, targetRelease.ID)
|
||||
var attachments []*repo_model.Attachment
|
||||
err = db.GetEngine(ctx).Where("release_id = ?", targetRelease.ID).Find(&attachments)
|
||||
if err != nil {
|
||||
ctx.APIError(http.StatusInternalServerError, "failed to get attachments")
|
||||
return
|
||||
|
||||
@@ -4,12 +4,14 @@
|
||||
package licensing
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"strconv"
|
||||
"time"
|
||||
|
||||
"code.mokoconsulting.tech/MokoConsulting/MokoGitea/models/db"
|
||||
licensing_model "code.mokoconsulting.tech/MokoConsulting/MokoGitea/models/licensing"
|
||||
"code.mokoconsulting.tech/MokoConsulting/MokoGitea/modules/json"
|
||||
mojo_json "code.mokoconsulting.tech/MokoConsulting/MokoGitea/modules/json"
|
||||
"code.mokoconsulting.tech/MokoConsulting/MokoGitea/modules/log"
|
||||
"code.mokoconsulting.tech/MokoConsulting/MokoGitea/modules/timeutil"
|
||||
"code.mokoconsulting.tech/MokoConsulting/MokoGitea/services/context"
|
||||
@@ -28,7 +30,7 @@ type createLicenseRequest struct {
|
||||
// CreateLicense handles POST /api/v1/licensing/licenses
|
||||
func CreateLicense(ctx *context.APIContext) {
|
||||
var req createLicenseRequest
|
||||
if err := ctx.BindJSON(&req); err != nil {
|
||||
if err := json.NewDecoder(ctx.Req.Body).Decode(&req); err != nil {
|
||||
ctx.APIError(http.StatusBadRequest, "invalid request body")
|
||||
return
|
||||
}
|
||||
@@ -83,7 +85,7 @@ func ListLicenses(ctx *context.APIContext) {
|
||||
// For now, get all licenses (pagination via offset)
|
||||
// TODO: add proper pagination to the model layer
|
||||
var licenses []*licensing_model.License
|
||||
err := ctx.Orm().Limit(limit, (page-1)*limit).Find(&licenses)
|
||||
err := db.GetEngine(ctx).Limit(limit, (page-1)*limit).Find(&licenses)
|
||||
if err != nil {
|
||||
ctx.APIError(http.StatusInternalServerError, "failed to list licenses")
|
||||
return
|
||||
@@ -106,7 +108,7 @@ func GetLicense(ctx *context.APIContext) {
|
||||
|
||||
license, err := licensing_model.GetLicenseByID(ctx, id)
|
||||
if err != nil || license == nil {
|
||||
ctx.NotFound()
|
||||
ctx.APIErrorNotFound()
|
||||
return
|
||||
}
|
||||
|
||||
@@ -160,12 +162,12 @@ func UpdateLicense(ctx *context.APIContext) {
|
||||
|
||||
license, err := licensing_model.GetLicenseByID(ctx, id)
|
||||
if err != nil || license == nil {
|
||||
ctx.NotFound()
|
||||
ctx.APIErrorNotFound()
|
||||
return
|
||||
}
|
||||
|
||||
var req updateLicenseRequest
|
||||
if err := ctx.BindJSON(&req); err != nil {
|
||||
if err := json.NewDecoder(ctx.Req.Body).Decode(&req); err != nil {
|
||||
ctx.APIError(http.StatusBadRequest, "invalid request body")
|
||||
return
|
||||
}
|
||||
@@ -205,7 +207,7 @@ func UpdateLicense(ctx *context.APIContext) {
|
||||
}
|
||||
if len(cols) > 0 {
|
||||
cols = append(cols, "updated_at")
|
||||
ctx.Orm().ID(id).Cols(cols...).Update(license)
|
||||
db.GetEngine(ctx).ID(id).Cols(cols...).Update(license)
|
||||
}
|
||||
|
||||
ctx.JSON(http.StatusOK, licenseToJSON(ctx, license))
|
||||
@@ -254,7 +256,7 @@ func MyLicenseDomains(ctx *context.APIContext) {
|
||||
|
||||
license, err := licensing_model.GetLicenseByID(ctx, id)
|
||||
if err != nil || license == nil || license.UserID != ctx.Doer.ID {
|
||||
ctx.NotFound()
|
||||
ctx.APIErrorNotFound()
|
||||
return
|
||||
}
|
||||
|
||||
@@ -285,7 +287,7 @@ func MyDeactivateDomain(ctx *context.APIContext) {
|
||||
|
||||
license, err := licensing_model.GetLicenseByID(ctx, id)
|
||||
if err != nil || license == nil || license.UserID != ctx.Doer.ID {
|
||||
ctx.NotFound()
|
||||
ctx.APIErrorNotFound()
|
||||
return
|
||||
}
|
||||
|
||||
@@ -326,12 +328,12 @@ type createTierRequest struct {
|
||||
// CreateTier handles POST /api/v1/licensing/tiers
|
||||
func CreateTier(ctx *context.APIContext) {
|
||||
var req createTierRequest
|
||||
if err := ctx.BindJSON(&req); err != nil {
|
||||
if err := json.NewDecoder(ctx.Req.Body).Decode(&req); err != nil {
|
||||
ctx.APIError(http.StatusBadRequest, "invalid request body")
|
||||
return
|
||||
}
|
||||
|
||||
reposJSON, _ := json.Marshal(req.Repos)
|
||||
reposJSON, _ := mojo_json.Marshal(req.Repos)
|
||||
tier := &licensing_model.ProductTier{
|
||||
TierKey: req.TierKey,
|
||||
TierName: req.TierName,
|
||||
@@ -340,7 +342,7 @@ func CreateTier(ctx *context.APIContext) {
|
||||
SortOrder: req.SortOrder,
|
||||
}
|
||||
|
||||
_, err := ctx.Orm().Insert(tier)
|
||||
_, err := db.GetEngine(ctx).Insert(tier)
|
||||
if err != nil {
|
||||
ctx.APIError(http.StatusInternalServerError, "failed to create tier")
|
||||
return
|
||||
@@ -365,14 +367,14 @@ func UpdateTier(ctx *context.APIContext) {
|
||||
}
|
||||
|
||||
tier := new(licensing_model.ProductTier)
|
||||
has, err := ctx.Orm().ID(id).Get(tier)
|
||||
has, err := db.GetEngine(ctx).ID(id).Get(tier)
|
||||
if err != nil || !has {
|
||||
ctx.NotFound()
|
||||
ctx.APIErrorNotFound()
|
||||
return
|
||||
}
|
||||
|
||||
var req updateTierRequest
|
||||
if err := ctx.BindJSON(&req); err != nil {
|
||||
if err := json.NewDecoder(ctx.Req.Body).Decode(&req); err != nil {
|
||||
ctx.APIError(http.StatusBadRequest, "invalid request body")
|
||||
return
|
||||
}
|
||||
@@ -383,7 +385,7 @@ func UpdateTier(ctx *context.APIContext) {
|
||||
cols = append(cols, "tier_name")
|
||||
}
|
||||
if req.Repos != nil {
|
||||
reposJSON, _ := json.Marshal(req.Repos)
|
||||
reposJSON, _ := mojo_json.Marshal(req.Repos)
|
||||
tier.Repos = string(reposJSON)
|
||||
cols = append(cols, "repos")
|
||||
}
|
||||
@@ -397,7 +399,7 @@ func UpdateTier(ctx *context.APIContext) {
|
||||
}
|
||||
|
||||
if len(cols) > 0 {
|
||||
ctx.Orm().ID(id).Cols(cols...).Update(tier)
|
||||
db.GetEngine(ctx).ID(id).Cols(cols...).Update(tier)
|
||||
}
|
||||
|
||||
ctx.JSON(http.StatusOK, tierToJSON(tier))
|
||||
@@ -413,19 +415,19 @@ func DeleteTier(ctx *context.APIContext) {
|
||||
|
||||
// Check if any licenses use this tier
|
||||
tier := new(licensing_model.ProductTier)
|
||||
has, _ := ctx.Orm().ID(id).Get(tier)
|
||||
has, _ := db.GetEngine(ctx).ID(id).Get(tier)
|
||||
if !has {
|
||||
ctx.NotFound()
|
||||
ctx.APIErrorNotFound()
|
||||
return
|
||||
}
|
||||
|
||||
count, _ := ctx.Orm().Where("tier = ?", tier.TierKey).Count(new(licensing_model.License))
|
||||
count, _ := db.GetEngine(ctx).Where("tier = ?", tier.TierKey).Count(new(licensing_model.License))
|
||||
if count > 0 {
|
||||
ctx.APIError(http.StatusConflict, "cannot delete tier with active licenses")
|
||||
return
|
||||
}
|
||||
|
||||
ctx.Orm().ID(id).Delete(new(licensing_model.ProductTier))
|
||||
db.GetEngine(ctx).ID(id).Delete(new(licensing_model.ProductTier))
|
||||
ctx.Status(http.StatusNoContent)
|
||||
}
|
||||
|
||||
|
||||
@@ -7,6 +7,7 @@ import (
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"code.mokoconsulting.tech/MokoConsulting/MokoGitea/models/db"
|
||||
licensing_model "code.mokoconsulting.tech/MokoConsulting/MokoGitea/models/licensing"
|
||||
"code.mokoconsulting.tech/MokoConsulting/MokoGitea/modules/json"
|
||||
"code.mokoconsulting.tech/MokoConsulting/MokoGitea/modules/templates"
|
||||
@@ -34,7 +35,7 @@ func LicenseTiers(ctx *context.Context) {
|
||||
|
||||
views := make([]tierView, 0, len(tiers))
|
||||
for _, t := range tiers {
|
||||
count, _ := ctx.Orm().Where("tier = ?", t.TierKey).Count(new(licensing_model.License))
|
||||
count, _ := db.GetEngine(ctx).Where("tier = ?", t.TierKey).Count(new(licensing_model.License))
|
||||
views = append(views, tierView{
|
||||
ProductTier: t,
|
||||
Repos: t.RepoList(),
|
||||
@@ -69,7 +70,7 @@ func LicenseTierCreate(ctx *context.Context) {
|
||||
SortOrder: sortOrder,
|
||||
}
|
||||
|
||||
if _, err := ctx.Orm().Insert(tier); err != nil {
|
||||
if _, err := db.GetEngine(ctx).Insert(tier); err != nil {
|
||||
ctx.Flash.Error("Failed to create tier: " + err.Error())
|
||||
} else {
|
||||
ctx.Flash.Success("Tier '" + tierName + "' created")
|
||||
@@ -82,7 +83,7 @@ func LicenseTierUpdate(ctx *context.Context) {
|
||||
id, _ := strconv.ParseInt(ctx.PathParam("id"), 10, 64)
|
||||
|
||||
tier := new(licensing_model.ProductTier)
|
||||
has, _ := ctx.Orm().ID(id).Get(tier)
|
||||
has, _ := db.GetEngine(ctx).ID(id).Get(tier)
|
||||
if !has {
|
||||
ctx.NotFound(nil)
|
||||
return
|
||||
@@ -95,7 +96,7 @@ func LicenseTierUpdate(ctx *context.Context) {
|
||||
tier.MaxDomains, _ = strconv.Atoi(ctx.FormString("max_domains"))
|
||||
tier.SortOrder, _ = strconv.Atoi(ctx.FormString("sort_order"))
|
||||
|
||||
if _, err := ctx.Orm().ID(id).Cols("tier_name", "repos", "max_domains", "sort_order").Update(tier); err != nil {
|
||||
if _, err := db.GetEngine(ctx).ID(id).Cols("tier_name", "repos", "max_domains", "sort_order").Update(tier); err != nil {
|
||||
ctx.Flash.Error("Failed to update tier: " + err.Error())
|
||||
} else {
|
||||
ctx.Flash.Success("Tier '" + tier.TierName + "' updated")
|
||||
@@ -108,20 +109,20 @@ func LicenseTierDelete(ctx *context.Context) {
|
||||
id, _ := strconv.ParseInt(ctx.FormString("id"), 10, 64)
|
||||
|
||||
tier := new(licensing_model.ProductTier)
|
||||
has, _ := ctx.Orm().ID(id).Get(tier)
|
||||
has, _ := db.GetEngine(ctx).ID(id).Get(tier)
|
||||
if !has {
|
||||
ctx.NotFound(nil)
|
||||
return
|
||||
}
|
||||
|
||||
count, _ := ctx.Orm().Where("tier = ?", tier.TierKey).Count(new(licensing_model.License))
|
||||
count, _ := db.GetEngine(ctx).Where("tier = ?", tier.TierKey).Count(new(licensing_model.License))
|
||||
if count > 0 {
|
||||
ctx.Flash.Error("Cannot delete tier with active licenses. Reassign licenses first.")
|
||||
ctx.Redirect("/admin/license-tiers")
|
||||
return
|
||||
}
|
||||
|
||||
ctx.Orm().ID(id).Delete(new(licensing_model.ProductTier))
|
||||
db.GetEngine(ctx).ID(id).Delete(new(licensing_model.ProductTier))
|
||||
ctx.Flash.Success("Tier '" + tier.TierName + "' deleted")
|
||||
ctx.Redirect("/admin/license-tiers")
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user