blob: 41dd9554137990ccea79587971af366e920d9db4 [file] [log] [blame]
Giorgi Lekveishvilie58fc592023-12-07 13:24:07 +04001package main
2
3import (
4 "encoding/json"
5 "fmt"
6 "net/http"
7
8 "github.com/giolekva/pcloud/core/ns-controller/controllers"
9)
10
11type Server struct {
12 s *http.Server
13 m *http.ServeMux
14 store controllers.ZoneStoreFactory
15}
16
17func NewServer(port int, store controllers.ZoneStoreFactory) *Server {
18 m := http.NewServeMux()
19 s := &Server{
20 s: &http.Server{
21 Addr: fmt.Sprintf(":%d", port),
22 Handler: m,
23 },
24 m: m,
25 store: store,
26 }
27 m.HandleFunc("/create-txt-record", s.createTxtRecord)
28 m.HandleFunc("/delete-txt-record", s.deleteTxtRecord)
29 m.HandleFunc("/admin/purge", s.purge)
30 return s
31}
32
33func (s *Server) Start() error {
34 return s.s.ListenAndServe()
35}
36
37type createTextRecordReq struct {
38 Domain string `json:"domain,omitempty"`
39 Entry string `json:"entry,omitempty"`
40 Text string `json:"text,omitempty"`
41}
42
43func (s *Server) purge(w http.ResponseWriter, r *http.Request) {
44 s.store.Purge()
45}
46
47func (s *Server) createTxtRecord(w http.ResponseWriter, r *http.Request) {
48 var req createTextRecordReq
49 if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
50 http.Error(w, err.Error(), http.StatusBadRequest)
51 return
52 }
53 zone, err := s.store.Get(req.Domain)
54 if err != nil {
55 http.Error(w, err.Error(), http.StatusInternalServerError)
56 return
57 }
58 if err := zone.AddTextRecord(req.Entry, req.Text); err != nil {
59 http.Error(w, err.Error(), http.StatusInternalServerError)
60 return
61 }
62 s.store.Debug()
63}
64
65func (s *Server) deleteTxtRecord(w http.ResponseWriter, r *http.Request) {
66 var req createTextRecordReq
67 if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
68 http.Error(w, err.Error(), http.StatusBadRequest)
69 return
70 }
71 zone, err := s.store.Get(req.Domain)
72 if err != nil {
73 http.Error(w, err.Error(), http.StatusInternalServerError)
74 return
75 }
76 if err := zone.DeleteTextRecord(req.Entry, req.Text); err != nil {
77 http.Error(w, err.Error(), http.StatusInternalServerError)
78 return
79 }
80 s.store.Debug()
81}