add mosis-portal Go project with package signing and validation
This commit is contained in:
35
portal/internal/api/handlers/handlers.go
Normal file
35
portal/internal/api/handlers/handlers.go
Normal file
@@ -0,0 +1,35 @@
|
||||
// Package handlers contains HTTP request handlers
|
||||
package handlers
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
)
|
||||
|
||||
// ErrorResponse represents an API error response
|
||||
type ErrorResponse struct {
|
||||
Error string `json:"error"`
|
||||
Message string `json:"message,omitempty"`
|
||||
}
|
||||
|
||||
// NotImplemented returns a 501 Not Implemented response
|
||||
func NotImplemented(w http.ResponseWriter, r *http.Request) {
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
w.WriteHeader(http.StatusNotImplemented)
|
||||
json.NewEncoder(w).Encode(ErrorResponse{
|
||||
Error: "not_implemented",
|
||||
Message: "This endpoint is not yet implemented",
|
||||
})
|
||||
}
|
||||
|
||||
// JSON writes a JSON response with the given status code
|
||||
func JSON(w http.ResponseWriter, status int, data interface{}) {
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
w.WriteHeader(status)
|
||||
json.NewEncoder(w).Encode(data)
|
||||
}
|
||||
|
||||
// Error writes a JSON error response
|
||||
func Error(w http.ResponseWriter, status int, err string, message string) {
|
||||
JSON(w, status, ErrorResponse{Error: err, Message: message})
|
||||
}
|
||||
100
portal/internal/api/router.go
Normal file
100
portal/internal/api/router.go
Normal file
@@ -0,0 +1,100 @@
|
||||
// Package api provides the HTTP API for mosis-portal
|
||||
package api
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"net/http"
|
||||
|
||||
"github.com/go-chi/chi/v5"
|
||||
"github.com/go-chi/chi/v5/middleware"
|
||||
"github.com/omixlab/mosis-portal/internal/api/handlers"
|
||||
"github.com/omixlab/mosis-portal/internal/config"
|
||||
)
|
||||
|
||||
// NewRouter creates and configures the HTTP router
|
||||
func NewRouter(cfg *config.Config, db *sql.DB) http.Handler {
|
||||
r := chi.NewRouter()
|
||||
|
||||
// Middleware
|
||||
r.Use(middleware.Logger)
|
||||
r.Use(middleware.Recoverer)
|
||||
r.Use(middleware.RealIP)
|
||||
r.Use(middleware.RequestID)
|
||||
|
||||
// Health check
|
||||
r.Get("/health", func(w http.ResponseWriter, r *http.Request) {
|
||||
w.WriteHeader(http.StatusOK)
|
||||
w.Write([]byte("ok"))
|
||||
})
|
||||
|
||||
// API v1
|
||||
r.Route("/v1", func(r chi.Router) {
|
||||
// Auth routes
|
||||
r.Route("/auth", func(r chi.Router) {
|
||||
r.Post("/oauth/github", handlers.NotImplemented)
|
||||
r.Get("/oauth/github/callback", handlers.NotImplemented)
|
||||
r.Post("/oauth/google", handlers.NotImplemented)
|
||||
r.Get("/oauth/google/callback", handlers.NotImplemented)
|
||||
r.Post("/refresh", handlers.NotImplemented)
|
||||
r.Post("/logout", handlers.NotImplemented)
|
||||
r.Get("/me", handlers.NotImplemented)
|
||||
})
|
||||
|
||||
// Developer apps
|
||||
r.Route("/apps", func(r chi.Router) {
|
||||
r.Get("/", handlers.NotImplemented)
|
||||
r.Post("/", handlers.NotImplemented)
|
||||
r.Get("/{appID}", handlers.NotImplemented)
|
||||
r.Patch("/{appID}", handlers.NotImplemented)
|
||||
r.Delete("/{appID}", handlers.NotImplemented)
|
||||
|
||||
// Versions
|
||||
r.Route("/{appID}/versions", func(r chi.Router) {
|
||||
r.Get("/", handlers.NotImplemented)
|
||||
r.Post("/", handlers.NotImplemented)
|
||||
r.Get("/{versionID}", handlers.NotImplemented)
|
||||
r.Post("/{versionID}/submit", handlers.NotImplemented)
|
||||
r.Post("/{versionID}/publish", handlers.NotImplemented)
|
||||
})
|
||||
})
|
||||
|
||||
// API Keys
|
||||
r.Route("/api-keys", func(r chi.Router) {
|
||||
r.Get("/", handlers.NotImplemented)
|
||||
r.Post("/", handlers.NotImplemented)
|
||||
r.Delete("/{keyID}", handlers.NotImplemented)
|
||||
})
|
||||
|
||||
// Signing Keys
|
||||
r.Route("/signing-keys", func(r chi.Router) {
|
||||
r.Get("/", handlers.NotImplemented)
|
||||
r.Post("/", handlers.NotImplemented)
|
||||
r.Delete("/{keyID}", handlers.NotImplemented)
|
||||
})
|
||||
|
||||
// Public store endpoints
|
||||
r.Route("/store", func(r chi.Router) {
|
||||
r.Get("/apps", handlers.NotImplemented)
|
||||
r.Get("/apps/{appID}", handlers.NotImplemented)
|
||||
r.Get("/apps/{appID}/download", handlers.NotImplemented)
|
||||
r.Get("/apps/updates", handlers.NotImplemented)
|
||||
})
|
||||
|
||||
// Telemetry
|
||||
r.Route("/telemetry", func(r chi.Router) {
|
||||
r.Post("/events", handlers.NotImplemented)
|
||||
r.Post("/crash", handlers.NotImplemented)
|
||||
})
|
||||
})
|
||||
|
||||
// Admin routes (htmx UI)
|
||||
r.Route("/admin", func(r chi.Router) {
|
||||
r.Get("/", handlers.NotImplemented)
|
||||
r.Get("/review-queue", handlers.NotImplemented)
|
||||
r.Get("/review/{versionID}", handlers.NotImplemented)
|
||||
r.Post("/review/{versionID}/approve", handlers.NotImplemented)
|
||||
r.Post("/review/{versionID}/reject", handlers.NotImplemented)
|
||||
})
|
||||
|
||||
return r
|
||||
}
|
||||
Reference in New Issue
Block a user