Cloudflare Cache Management:
- GET /api/v1/admin/cloudflare/zones
- POST /api/v1/admin/cloudflare/cache/purge-all
- POST /api/v1/admin/cloudflare/cache/purge-urls
- POST /api/v1/admin/cloudflare/cache/purge-tags
- POST /api/v1/admin/cloudflare/cache/purge-hosts
cPanel Email Management:
- GET /api/v1/admin/cpanel/emails
- POST /api/v1/admin/cpanel/emails
- DELETE /api/v1/admin/cpanel/emails/{email}
- PUT /api/v1/admin/cpanel/emails/{email}/password
- PUT /api/v1/admin/cpanel/emails/{email}/quota
All routes protected by JWT auth middleware.
Added CLOUDFLARE_* and CPANEL_* env vars to .env.example
177 lines
5.1 KiB
Go
177 lines
5.1 KiB
Go
package cloudflare
|
|
|
|
import (
|
|
"encoding/json"
|
|
"net/http"
|
|
)
|
|
|
|
// Handler handles Cloudflare admin endpoints
|
|
type Handler struct {
|
|
client *Client
|
|
}
|
|
|
|
// NewHandler creates a new Cloudflare handler
|
|
func NewHandler() *Handler {
|
|
return &Handler{
|
|
client: NewClient(),
|
|
}
|
|
}
|
|
|
|
// PurgeURLsRequest contains URLs to purge from cache
|
|
type PurgeURLsRequest struct {
|
|
URLs []string `json:"urls"`
|
|
}
|
|
|
|
// PurgeTagsRequest contains cache tags to purge
|
|
type PurgeTagsRequest struct {
|
|
Tags []string `json:"tags"`
|
|
}
|
|
|
|
// PurgeHostsRequest contains hostnames to purge
|
|
type PurgeHostsRequest struct {
|
|
Hosts []string `json:"hosts"`
|
|
}
|
|
|
|
// GetZones godoc
|
|
// @Summary List Cloudflare Zones
|
|
// @Description Returns all zones associated with the Cloudflare account
|
|
// @Tags Admin - Cloudflare
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Success 200 {array} Zone
|
|
// @Failure 500 {string} string "Internal Server Error"
|
|
// @Security BearerAuth
|
|
// @Router /api/v1/admin/cloudflare/zones [get]
|
|
func (h *Handler) GetZones(w http.ResponseWriter, r *http.Request) {
|
|
zones, err := h.client.GetZones()
|
|
if err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
w.Header().Set("Content-Type", "application/json")
|
|
json.NewEncoder(w).Encode(zones)
|
|
}
|
|
|
|
// PurgeAll godoc
|
|
// @Summary Purge All Cache
|
|
// @Description Purges all cached content for the configured zone
|
|
// @Tags Admin - Cloudflare
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Success 200 {object} PurgeResponse
|
|
// @Failure 500 {string} string "Internal Server Error"
|
|
// @Security BearerAuth
|
|
// @Router /api/v1/admin/cloudflare/cache/purge-all [post]
|
|
func (h *Handler) PurgeAll(w http.ResponseWriter, r *http.Request) {
|
|
result, err := h.client.PurgeAll()
|
|
if err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
w.Header().Set("Content-Type", "application/json")
|
|
json.NewEncoder(w).Encode(result)
|
|
}
|
|
|
|
// PurgeByURLs godoc
|
|
// @Summary Purge Cache by URLs
|
|
// @Description Purges specific URLs from cache
|
|
// @Tags Admin - Cloudflare
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param body body PurgeURLsRequest true "URLs to purge"
|
|
// @Success 200 {object} PurgeResponse
|
|
// @Failure 400 {string} string "Bad Request"
|
|
// @Failure 500 {string} string "Internal Server Error"
|
|
// @Security BearerAuth
|
|
// @Router /api/v1/admin/cloudflare/cache/purge-urls [post]
|
|
func (h *Handler) PurgeByURLs(w http.ResponseWriter, r *http.Request) {
|
|
var req PurgeURLsRequest
|
|
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
|
http.Error(w, "Invalid request body", http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
if len(req.URLs) == 0 {
|
|
http.Error(w, "URLs array is required", http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
result, err := h.client.PurgeByURLs(req.URLs)
|
|
if err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
w.Header().Set("Content-Type", "application/json")
|
|
json.NewEncoder(w).Encode(result)
|
|
}
|
|
|
|
// PurgeByTags godoc
|
|
// @Summary Purge Cache by Tags
|
|
// @Description Purges content by cache tags (Enterprise only)
|
|
// @Tags Admin - Cloudflare
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param body body PurgeTagsRequest true "Tags to purge"
|
|
// @Success 200 {object} PurgeResponse
|
|
// @Failure 400 {string} string "Bad Request"
|
|
// @Failure 500 {string} string "Internal Server Error"
|
|
// @Security BearerAuth
|
|
// @Router /api/v1/admin/cloudflare/cache/purge-tags [post]
|
|
func (h *Handler) PurgeByTags(w http.ResponseWriter, r *http.Request) {
|
|
var req PurgeTagsRequest
|
|
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
|
http.Error(w, "Invalid request body", http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
if len(req.Tags) == 0 {
|
|
http.Error(w, "Tags array is required", http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
result, err := h.client.PurgeByTags(req.Tags)
|
|
if err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
w.Header().Set("Content-Type", "application/json")
|
|
json.NewEncoder(w).Encode(result)
|
|
}
|
|
|
|
// PurgeByHosts godoc
|
|
// @Summary Purge Cache by Hosts
|
|
// @Description Purges content by hostnames
|
|
// @Tags Admin - Cloudflare
|
|
// @Accept json
|
|
// @Produce json
|
|
// @Param body body PurgeHostsRequest true "Hosts to purge"
|
|
// @Success 200 {object} PurgeResponse
|
|
// @Failure 400 {string} string "Bad Request"
|
|
// @Failure 500 {string} string "Internal Server Error"
|
|
// @Security BearerAuth
|
|
// @Router /api/v1/admin/cloudflare/cache/purge-hosts [post]
|
|
func (h *Handler) PurgeByHosts(w http.ResponseWriter, r *http.Request) {
|
|
var req PurgeHostsRequest
|
|
if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
|
|
http.Error(w, "Invalid request body", http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
if len(req.Hosts) == 0 {
|
|
http.Error(w, "Hosts array is required", http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
result, err := h.client.PurgeByHosts(req.Hosts)
|
|
if err != nil {
|
|
http.Error(w, err.Error(), http.StatusInternalServerError)
|
|
return
|
|
}
|
|
|
|
w.Header().Set("Content-Type", "application/json")
|
|
json.NewEncoder(w).Encode(result)
|
|
}
|