github.com/korniux/gophish@v0.9.0/controllers/api/page.go (about)

     1  package api
     2  
     3  import (
     4  	"encoding/json"
     5  	"net/http"
     6  	"strconv"
     7  	"time"
     8  
     9  	ctx "github.com/gophish/gophish/context"
    10  	log "github.com/gophish/gophish/logger"
    11  	"github.com/gophish/gophish/models"
    12  	"github.com/gorilla/mux"
    13  	"github.com/jinzhu/gorm"
    14  )
    15  
    16  // Pages handles requests for the /api/pages/ endpoint
    17  func (as *Server) Pages(w http.ResponseWriter, r *http.Request) {
    18  	switch {
    19  	case r.Method == "GET":
    20  		ps, err := models.GetPages(ctx.Get(r, "user_id").(int64))
    21  		if err != nil {
    22  			log.Error(err)
    23  		}
    24  		JSONResponse(w, ps, http.StatusOK)
    25  	//POST: Create a new page and return it as JSON
    26  	case r.Method == "POST":
    27  		p := models.Page{}
    28  		// Put the request into a page
    29  		err := json.NewDecoder(r.Body).Decode(&p)
    30  		if err != nil {
    31  			JSONResponse(w, models.Response{Success: false, Message: "Invalid request"}, http.StatusBadRequest)
    32  			return
    33  		}
    34  		// Check to make sure the name is unique
    35  		_, err = models.GetPageByName(p.Name, ctx.Get(r, "user_id").(int64))
    36  		if err != gorm.ErrRecordNotFound {
    37  			JSONResponse(w, models.Response{Success: false, Message: "Page name already in use"}, http.StatusConflict)
    38  			log.Error(err)
    39  			return
    40  		}
    41  		p.ModifiedDate = time.Now().UTC()
    42  		p.UserId = ctx.Get(r, "user_id").(int64)
    43  		err = models.PostPage(&p)
    44  		if err != nil {
    45  			JSONResponse(w, models.Response{Success: false, Message: err.Error()}, http.StatusInternalServerError)
    46  			return
    47  		}
    48  		JSONResponse(w, p, http.StatusCreated)
    49  	}
    50  }
    51  
    52  // Page contains functions to handle the GET'ing, DELETE'ing, and PUT'ing
    53  // of a Page object
    54  func (as *Server) Page(w http.ResponseWriter, r *http.Request) {
    55  	vars := mux.Vars(r)
    56  	id, _ := strconv.ParseInt(vars["id"], 0, 64)
    57  	p, err := models.GetPage(id, ctx.Get(r, "user_id").(int64))
    58  	if err != nil {
    59  		JSONResponse(w, models.Response{Success: false, Message: "Page not found"}, http.StatusNotFound)
    60  		return
    61  	}
    62  	switch {
    63  	case r.Method == "GET":
    64  		JSONResponse(w, p, http.StatusOK)
    65  	case r.Method == "DELETE":
    66  		err = models.DeletePage(id, ctx.Get(r, "user_id").(int64))
    67  		if err != nil {
    68  			JSONResponse(w, models.Response{Success: false, Message: "Error deleting page"}, http.StatusInternalServerError)
    69  			return
    70  		}
    71  		JSONResponse(w, models.Response{Success: true, Message: "Page Deleted Successfully"}, http.StatusOK)
    72  	case r.Method == "PUT":
    73  		p = models.Page{}
    74  		err = json.NewDecoder(r.Body).Decode(&p)
    75  		if err != nil {
    76  			log.Error(err)
    77  		}
    78  		if p.Id != id {
    79  			JSONResponse(w, models.Response{Success: false, Message: "/:id and /:page_id mismatch"}, http.StatusBadRequest)
    80  			return
    81  		}
    82  		p.ModifiedDate = time.Now().UTC()
    83  		p.UserId = ctx.Get(r, "user_id").(int64)
    84  		err = models.PutPage(&p)
    85  		if err != nil {
    86  			JSONResponse(w, models.Response{Success: false, Message: "Error updating page: " + err.Error()}, http.StatusInternalServerError)
    87  			return
    88  		}
    89  		JSONResponse(w, p, http.StatusOK)
    90  	}
    91  }