68845abd59
Branch Policy Check / Verify merge target (pull_request) Has been cancelled
Universal: PR Check / Branch Policy (pull_request) Has been cancelled
PR RC Release / Build RC Release (pull_request) Has been cancelled
Universal: PR Check / Validate PR (pull_request) Has been cancelled
Branch Cleanup / Delete merged branch (pull_request) Has been cancelled
Universal: Pre-Release / Build Pre-Release (${{ inputs.stability || 'development' }}) (pull_request) Has been cancelled
Universal: PR Check / Build RC Package (pull_request) Has been cancelled
Add REST API for managing license packages and keys:
- GET/POST /api/v1/repos/{owner}/{repo}/license-packages
- GET/POST /api/v1/repos/{owner}/{repo}/license-keys
- DELETE /api/v1/repos/{owner}/{repo}/license-keys/{id}
- GET /api/v1/repos/{owner}/{repo}/license-keys/{id}/usage
API structs for create/edit/response, with raw key only returned on
creation. Requires repo admin permissions.
Ref #239
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
108 lines
3.9 KiB
Go
108 lines
3.9 KiB
Go
// Copyright 2026 Moko Consulting <hello@mokoconsulting.tech>
|
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
|
|
|
package structs
|
|
|
|
import "time"
|
|
|
|
// LicensePackage represents a license package (subscription tier).
|
|
type LicensePackage struct {
|
|
ID int64 `json:"id"`
|
|
OwnerID int64 `json:"owner_id"`
|
|
Name string `json:"name"`
|
|
Description string `json:"description"`
|
|
DurationDays int `json:"duration_days"`
|
|
MaxSites int `json:"max_sites"`
|
|
RepoScope string `json:"repo_scope"`
|
|
AllowedChannels string `json:"allowed_channels"`
|
|
IsActive bool `json:"is_active"`
|
|
// swagger:strfmt date-time
|
|
Created time.Time `json:"created_at"`
|
|
// swagger:strfmt date-time
|
|
Updated time.Time `json:"updated_at"`
|
|
}
|
|
|
|
// CreateLicensePackageOption options for creating a license package.
|
|
type CreateLicensePackageOption struct {
|
|
Name string `json:"name" binding:"Required"`
|
|
Description string `json:"description"`
|
|
DurationDays int `json:"duration_days"`
|
|
MaxSites int `json:"max_sites"`
|
|
RepoScope string `json:"repo_scope"`
|
|
AllowedChannels string `json:"allowed_channels"`
|
|
}
|
|
|
|
// EditLicensePackageOption options for editing a license package.
|
|
type EditLicensePackageOption struct {
|
|
Name *string `json:"name"`
|
|
Description *string `json:"description"`
|
|
DurationDays *int `json:"duration_days"`
|
|
MaxSites *int `json:"max_sites"`
|
|
RepoScope *string `json:"repo_scope"`
|
|
AllowedChannels *string `json:"allowed_channels"`
|
|
IsActive *bool `json:"is_active"`
|
|
}
|
|
|
|
// LicenseKey represents a license key (response — never includes raw key except on creation).
|
|
type LicenseKey struct {
|
|
ID int64 `json:"id"`
|
|
PackageID int64 `json:"package_id"`
|
|
OwnerID int64 `json:"owner_id"`
|
|
KeyPrefix string `json:"key_prefix"`
|
|
LicenseeName string `json:"licensee_name"`
|
|
LicenseeEmail string `json:"licensee_email"`
|
|
DomainRestriction string `json:"domain_restriction"`
|
|
MaxSites int `json:"max_sites"`
|
|
IsInternal bool `json:"is_internal"`
|
|
IsActive bool `json:"is_active"`
|
|
// swagger:strfmt date-time
|
|
StartsAt *time.Time `json:"starts_at"`
|
|
// swagger:strfmt date-time
|
|
ExpiresAt *time.Time `json:"expires_at"`
|
|
// swagger:strfmt date-time
|
|
Created time.Time `json:"created_at"`
|
|
}
|
|
|
|
// LicenseKeyCreated is the response when a key is first created (includes raw key).
|
|
type LicenseKeyCreated struct {
|
|
LicenseKey
|
|
// RawKey is the full license key string. Only returned on creation.
|
|
RawKey string `json:"raw_key"`
|
|
}
|
|
|
|
// CreateLicenseKeyOption options for creating a license key.
|
|
type CreateLicenseKeyOption struct {
|
|
PackageID int64 `json:"package_id" binding:"Required"`
|
|
LicenseeName string `json:"licensee_name"`
|
|
LicenseeEmail string `json:"licensee_email"`
|
|
DomainRestriction string `json:"domain_restriction"`
|
|
MaxSites int `json:"max_sites"`
|
|
// StartsAt is optional; defaults to now.
|
|
StartsAt *time.Time `json:"starts_at"`
|
|
// ExpiresAt is optional; auto-calculated from package duration if not set.
|
|
ExpiresAt *time.Time `json:"expires_at"`
|
|
}
|
|
|
|
// EditLicenseKeyOption options for editing a license key.
|
|
type EditLicenseKeyOption struct {
|
|
LicenseeName *string `json:"licensee_name"`
|
|
LicenseeEmail *string `json:"licensee_email"`
|
|
DomainRestriction *string `json:"domain_restriction"`
|
|
MaxSites *int `json:"max_sites"`
|
|
IsActive *bool `json:"is_active"`
|
|
ExpiresAt *time.Time `json:"expires_at"`
|
|
}
|
|
|
|
// LicenseKeyUsage represents a usage tracking entry.
|
|
type LicenseKeyUsage struct {
|
|
ID int64 `json:"id"`
|
|
KeyID int64 `json:"key_id"`
|
|
RepoID int64 `json:"repo_id"`
|
|
Domain string `json:"domain"`
|
|
IPAddress string `json:"ip_address"`
|
|
UserAgent string `json:"user_agent"`
|
|
VersionFrom string `json:"version_from"`
|
|
// swagger:strfmt date-time
|
|
Created time.Time `json:"created_at"`
|
|
}
|