Junior — Senior
64
Оптимизация и реструктуризация Go‑кода
Условие задачи
Выполните рефакторинг приведённого фрагмента на Go, улучшив читаемость, убрав дублирование и устранив потенциальные уязвимости. При этом сохраняйте исходную бизнес‑логику.
func checkName(name string) error {
if len(name) > 50 {
return errors.New("invalid name length")
}
return nil
}
func checkPhone(phone string) error {
if len(phone) != 11 {
return errors.New("invalid phone format")
}
return nil
}
type Account struct {
Id int `json:"id"`
Name string `json:"name"`
Password string `json:"password"`
Phone string `json:"phone"`
IsAdmin bool `json:"is_admin"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt time.Time `json:"updated_at"`
}
type AccountRepo interface {
Find(sql string) *Account
Save(account *Account)
}
type AccountHandler struct {
repo AccountRepo
logger *zap.Logger
}
func NewAccountHandler(repo AccountRepo) *AccountHandler {
handler := &AccountHandler{repo: repo}
if os.Getenv("ENV") == "prod" {
handler.logger, _ = zap.NewProduction()
} else {
handler.logger, _ = zap.NewDevelopment()
}
return handler
}
func (h *AccountHandler) Login(c *gin.Context) {
login := c.GetString("username")
pass := c.GetString("password")
acc := h.repo.Find(fmt.Sprintf("SELECT * FROM user WHERE username = %s", login))
if acc == nil {
c.JSON(http.StatusOK, nil)
return
}
if acc.Password == pass {
c.SetCookie("auth_session_id", uuid.New().String(), 3600, "/", "", false, false)
c.JSON(http.StatusOK, map[string]string{"status": "ok"})
}
}
func (h *AccountHandler) ProcessRequest(c *gin.Context) {
requesterId := c.GetInt("auth_user_id")
requester := h.repo.Find(fmt.Sprintf("SELECT * FROM user WHERE id = %d", requesterId))
targetId := c.Query("id")
target := h.repo.Find(fmt.Sprintf("SELECT * FROM user WHERE id = %s", targetId))
if requester.IsAdmin || requester.Id == target.Id {
if c.Request.Method == "POST" {
bytes, _ := io.ReadAll(c.Request.Body)
var body map[string]string
json.Unmarshal(bytes, &body)
}
}
}
Задача направлена на выделение общих проверок, улучшение именования, замену прямой подстановки параметров в SQL‑запросы и приведение к единому стилю кода.