/* * Copyright (C) 2024 Jonni Liljamo * * This file is licensed under AGPL-3.0-or-later, see NOTICE and LICENSE for * more information. */ package handlers import ( "net/http" "regexp" "strings" "git.src.quest/~liljamo/felu/internal/db" "git.src.quest/~liljamo/felu/internal/util" "github.com/gin-gonic/gin" ) type postDomainData struct { Domain string `form:"domain"` ARecord string `form:"a_record"` } // PostDomain returns a gin handler func PostDomain() gin.HandlerFunc { return func(c *gin.Context) { data := &postDomainData{} if err := c.Bind(data); err != nil { c.String(http.StatusBadRequest, "Could not bind domain data") c.Abort() return } if data.Domain == "" { c.String(http.StatusBadRequest, "Domain can't be empty") c.Abort() return } if strings.Contains(data.Domain, ".") { c.String(http.StatusBadRequest, "Domain can't contain full stops") c.Abort() return } // NOTE: I doubt doing a little regex here will matter, just the easiest for now. if !regexp.MustCompile(`^[A-Za-z0-9]*$`).MatchString(data.Domain) { c.String(http.StatusBadRequest, "Domain contains invalid chars") c.Abort() return } if err := util.CheckARecord(data.ARecord); err != nil { c.String(http.StatusBadRequest, err.Error()) c.Abort() return } userID, exists := c.Get("user_id") if !exists { c.String(http.StatusInternalServerError, "This should not be possible, but don't quote me on that") c.Abort() return } err := db.CreateDomain(data.Domain, data.ARecord, userID.(string)) if err != nil { // FIXME: Handle better c.String(http.StatusInternalServerError, "Something went wrong while creating a new domain") c.Abort() return } c.Header("HX-Trigger", "update-domain-list") } } // PatchDomain returns a gin handler func PatchDomain() gin.HandlerFunc { return func(c *gin.Context) { userID, exists := c.Get("user_id") if !exists { c.String(http.StatusInternalServerError, "This should not be possible, but don't quote me on that") c.Abort() return } id := c.Param("id") aRecord := c.PostForm("a_record") if aRecord != "" { if err := util.CheckARecord(aRecord); err != nil { c.String(http.StatusBadRequest, err.Error()) c.Abort() return } err := db.UpdateDomainARecordManual(id, userID.(string), aRecord) if err != nil { // FIXME: Handle better c.String(http.StatusInternalServerError, "Something went wrong while updating the a record") c.Abort() return } } c.Header("HX-Trigger", "update-domain-list") } } // DeleteDomain returns a gin handler func DeleteDomain() gin.HandlerFunc { return func(c *gin.Context) { id := c.Param("id") userID, exists := c.Get("user_id") if !exists { c.String(http.StatusInternalServerError, "This should not be possible, but don't quote me on that") c.Abort() return } err := db.DeleteDomain(id, userID.(string)) if err != nil { // FIXME: Handle better c.String(http.StatusInternalServerError, "Something went wrong while deleting the domain") c.Abort() return } c.Header("HX-Trigger", "update-domain-list") } } // RefreshDomainAPIKey returns a gin handler func RefreshDomainAPIKey() gin.HandlerFunc { return func(c *gin.Context) { id := c.Param("id") userID, exists := c.Get("user_id") if !exists { c.String(http.StatusInternalServerError, "This should not be possible, but don't quote me on that") c.Abort() return } err := db.RefreshDomainAPIKey(id, userID.(string)) if err != nil { // FIXME: Handle better c.String(http.StatusInternalServerError, "Something went wrong while updating the api key") c.Abort() return } c.Header("HX-Trigger", "update-domain-list") } } // RefreshDomainTsigKey returns a gin handler func RefreshDomainTsigKey() gin.HandlerFunc { return func(c *gin.Context) { id := c.Param("id") userID, exists := c.Get("user_id") if !exists { c.String(http.StatusInternalServerError, "This should not be possible, but don't quote me on that") c.Abort() return } err := db.RefreshDomainTsigKey(id, userID.(string)) if err != nil { // FIXME: Handle better c.String(http.StatusInternalServerError, "Something went wrong while updating the tsig key") c.Abort() return } c.Header("HX-Trigger", "update-domain-list") } }