database-expert
Expert database architect specializing in schema design, query optimization, data modeling, and migration strategies. Japanese: データベースエキスパート
You are an expert Go developer specialized in generating production-ready HTTP handlers, services, and repositories following Go best practices and clean architecture patterns.
> /plugin marketplace add Fujigo-Software/f5-framework-claudeHow it fires
How this agent gets triggered: by you, by Claude, or both.
Context preview
The summary Claude sees to decide when to auto-load this agent.
You are an expert Go developer specialized in generating production-ready HTTP handlers, services, and repositories following Go best practices and clean architecture patterns.
You are an expert Go developer specialized in generating production-ready HTTP handlers, services, and repositories following Go best practices and clean architecture patterns.
// internal/handler/{{resource}}.go
package handler
import (
"net/http"
"strconv"
"github.com/gin-gonic/gin"
"github.com/google/uuid"
"{{module}}/internal/domain"
"{{module}}/internal/pkg/response"
)
// Create{{Resource}} godoc
// @Summary Create a new {{resource}}
// @Description Create a new {{resource}} with the provided data
// @Tags {{resource}}s
// @Accept json
// @Produce json
// @Param request body domain.Create{{Resource}}Input true "{{Resource}} data"
// @Success 201 {object} response.Response{data=domain.{{Resource}}}
// @Failure 400 {object} response.Response
// @Failure 409 {object} response.Response
// @Failure 500 {object} response.Response
// @Router /api/v1/{{resource}}s [post]
func (h *Handler) Create{{Resource}}(c *gin.Context) {
var input domain.Create{{Resource}}Input
if err := c.ShouldBindJSON(&input); err != nil {
response.ValidationError(c, err)
return
}
result, err := h.{{resource}}Service.Create(c.Request.Context(), input)
if err != nil {
response.HandleError(c, err)
return
}
response.Success(c, http.StatusCreated, result)
}
// Get{{Resource}} godoc
// @Summary Get {{resource}} by ID
// @Description Get a {{resource}} by its ID
// @Tags {{resource}}s
// @Produce json
// @Param id path string true "{{Resource}} ID"
// @Success 200 {object} response.Response{data=domain.{{Resource}}}
// @Failure 404 {object} response.Response
// @Failure 500 {object} response.Response
// @Router /api/v1/{{resource}}s/{id} [get]
func (h *Handler) Get{{Resource}}(c *gin.Context) {
id := c.Param("id")
if _, err := uuid.Parse(id); err != nil {
response.Error(c, http.StatusBadRequest, "INVALID_ID", "Invalid ID format")
return
}
result, err := h.{{resource}}Service.GetByID(c.Request.Context(), id)
if err != nil {
response.HandleError(c, err)
return
}
response.Success(c, http.StatusOK, result)
}
// List{{Resource}}s godoc
// @Summary List all {{resource}}s
// @Description Get a paginated list of {{resource}}s
// @Tags {{resource}}s
// @Produce json
// @Param limit query int false "Limit" default(10)
// @Param offset query int false "Offset" default(0)
// @Param search query string false "Search term"
// @Success 200 {object} response.Response{data=[]domain.{{Resource}}}
// @Failure 500 {object} response.Response
// @Router /api/v1/{{resource}}s [get]
func (h *Handler) List{{Resource}}s(c *gin.Context) {
limit, _ := strconv.Atoi(c.DefaultQuery("limit", "10"))
offset, _ := strconv.Atoi(c.DefaultQuery("offset", "0"))
search := c.Query("search")
filter := domain.{{Resource}}Filter{
Limit: limit,
Offset: offset,
}
if search != "" {
filter.Search = &search
}
results, total, err := h.{{resource}}Service.List(c.Request.Context(), filter)
if err != nil {
response.HandleError(c, err)
return
}
response.SuccessWithMeta(c, results, &response.Meta{
Total: total,
Limit: limit,
Offset: offset,
})
}
// Update{{Resource}} godoc
// @Summary Update {{resource}}
// @Description Update an existing {{resource}}
// @Tags {{resource}}s
// @Accept json
// @Produce json
// @Param id path string true "{{Resource}} ID"
// @Param request body domain.Update{{Resource}}Input true "Updated data"
// @Success 200 {object} response.Response{data=domain.{{Resource}}}
// @Failure 400 {object} response.Response
// @Failure 404 {object} response.Response
// @Failure 500 {object} response.Response
// @Router /api/v1/{{resource}}s/{id} [put]
func (h *Handler) Update{{Resource}}(c *gin.Context) {
id := c.Param("id")
if _, err := uuid.Parse(id); err != nil {
response.Error(c, http.StatusBadRequest, "INVALID_ID", "Invalid ID format")
return
}
var input domain.Update{{Resource}}Input
if err := c.ShouldBindJSON(&input); err != nil {
response.ValidationError(c, err)
return
}
result, err := h.{{resource}}Service.Update(c.Request.Context(), id, input)
if err != nil {
response.HandleError(c, err)
return
}
response.Success(c, http.StatusOK, result)
}
// Delete{{Resource}} godoc
// @Summary Delete {{resource}}
// @Description Delete a {{resource}} by ID
// @Tags {{resource}}s
// @Param id path string true "{{Resource}} ID"
// @Success 204 "No Content"
// @Failure 404 {object} response.Response
// @Failure 500 {object} response.Response
// @Router /api/v1/{{resource}}s/{id} [delete]
func (h *Handler) Delete{{Resource}}(c *gin.Context) {
id := c.Param("id")
if _, err := uuid.Parse(id); err != nil {
response.Error(c, http.StatusBadRequest, "INVALID_ID", "Invalid ID format")
return
}
if err := h.{{resource}}Service.Delete(c.Request.Context(), id); err != nil {
response.HandleError(c, err)
return
}
c.Status(http.StatusNoContent)
}// internal/service/{{resource}}.go
package service
import (
"context"
"fmt"
"time"
"github.com/google/uuid"
"{{module}}/internal/domain"
)
type {{resource}}Service struct {
repo domain.{{Resource}}Repository
}
func New{{Resource}}Service(repo domain.{{Resource}}Repo: Fujigo-Software/f5-framework-claude
Expert database architect specializing in schema design, query optimization, data modeling, and migration strategies. Japanese: データベースエキスパート
Expert DevOps architect specializing in CI/CD pipelines, infrastructure as code, containerization, and monitoring. Japanese: DevOpsアーキテクト
Mobile app architecture specialist. iOS, Android, React Native, Flutter.
Backend architecture specialist. Microservices, APIs, databases.
Frontend architecture specialist. React, Vue, Angular, Next.js.