fix: resolve all compile errors in licensing endpoints #662

Merged
jmiller merged 2 commits from dev into main 2026-06-21 04:10:10 +00:00
3 changed files with 33 additions and 29 deletions
+2 -1
View File
@@ -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
+23 -21
View File
@@ -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)
}
+8 -7
View File
@@ -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")
}