ns-controller: manage txt records
diff --git a/core/ns-controller/server.go b/core/ns-controller/server.go
new file mode 100644
index 0000000..41dd955
--- /dev/null
+++ b/core/ns-controller/server.go
@@ -0,0 +1,81 @@
+package main
+
+import (
+ "encoding/json"
+ "fmt"
+ "net/http"
+
+ "github.com/giolekva/pcloud/core/ns-controller/controllers"
+)
+
+type Server struct {
+ s *http.Server
+ m *http.ServeMux
+ store controllers.ZoneStoreFactory
+}
+
+func NewServer(port int, store controllers.ZoneStoreFactory) *Server {
+ m := http.NewServeMux()
+ s := &Server{
+ s: &http.Server{
+ Addr: fmt.Sprintf(":%d", port),
+ Handler: m,
+ },
+ m: m,
+ store: store,
+ }
+ m.HandleFunc("/create-txt-record", s.createTxtRecord)
+ m.HandleFunc("/delete-txt-record", s.deleteTxtRecord)
+ m.HandleFunc("/admin/purge", s.purge)
+ return s
+}
+
+func (s *Server) Start() error {
+ return s.s.ListenAndServe()
+}
+
+type createTextRecordReq struct {
+ Domain string `json:"domain,omitempty"`
+ Entry string `json:"entry,omitempty"`
+ Text string `json:"text,omitempty"`
+}
+
+func (s *Server) purge(w http.ResponseWriter, r *http.Request) {
+ s.store.Purge()
+}
+
+func (s *Server) createTxtRecord(w http.ResponseWriter, r *http.Request) {
+ var req createTextRecordReq
+ if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
+ http.Error(w, err.Error(), http.StatusBadRequest)
+ return
+ }
+ zone, err := s.store.Get(req.Domain)
+ if err != nil {
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
+ }
+ if err := zone.AddTextRecord(req.Entry, req.Text); err != nil {
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
+ }
+ s.store.Debug()
+}
+
+func (s *Server) deleteTxtRecord(w http.ResponseWriter, r *http.Request) {
+ var req createTextRecordReq
+ if err := json.NewDecoder(r.Body).Decode(&req); err != nil {
+ http.Error(w, err.Error(), http.StatusBadRequest)
+ return
+ }
+ zone, err := s.store.Get(req.Domain)
+ if err != nil {
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
+ }
+ if err := zone.DeleteTextRecord(req.Entry, req.Text); err != nil {
+ http.Error(w, err.Error(), http.StatusInternalServerError)
+ return
+ }
+ s.store.Debug()
+}