Select Git revision
Forked from
meskio / cicer
30 commits behind the upstream repository.

meskio authored
member.go 4.71 KiB
package api
import (
"encoding/json"
"errors"
"log"
"net/http"
"strconv"
"0xacab.org/meskio/cicer/api/db"
"github.com/gorilla/mux"
)
func (a *api) AddMember(w http.ResponseWriter, req *http.Request) {
var memberReq db.MemberReq
err := json.NewDecoder(req.Body).Decode(&memberReq)
if err != nil {
log.Printf("Can't create member: %v", err)
w.WriteHeader(http.StatusInternalServerError)
return
}
member, err := a.db.AddMember(&memberReq)
if err != nil {
log.Printf("Can't create member: %v\n%v", err, member)
w.WriteHeader(http.StatusInternalServerError)
return
}
if memberReq.Password == "" {
_, token, err := a.db.NewPasswordReset(memberReq.Email)
if err != nil {
log.Printf("Can't create the password reset for %s: %v", memberReq.Email, err)
w.WriteHeader(http.StatusInternalServerError)
return
}
err = a.mail.sendNewMember(memberReq.Member, "/reset/"+token)
if err != nil {
log.Printf("Can't send the pass/login reset email to %s: %v", memberReq.Email, err)
w.WriteHeader(http.StatusInternalServerError)
return
}
}
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusCreated)
err = json.NewEncoder(w).Encode(member)
if err != nil {
log.Printf("Can't encode added member: %v", err)
w.WriteHeader(http.StatusInternalServerError)
return
}
}
func (a *api) ListMembers(w http.ResponseWriter, req *http.Request) {
members, err := a.db.ListMembers()
if err != nil {
log.Printf("Can't list members: %v", err)
w.WriteHeader(http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
err = json.NewEncoder(w).Encode(members)
if err != nil {
log.Printf("Can't encode members: %v", err)
w.WriteHeader(http.StatusInternalServerError)
return
}
}
func (a *api) GetMember(w http.ResponseWriter, req *http.Request) {
vars := mux.Vars(req)
num, _ := strconv.Atoi(vars["num"])
a.getMemberNum(num, w, req)
}
func (a *api) getMemberNum(num int, w http.ResponseWriter, req *http.Request) {
member, err := a.db.GetMember(num)
if err != nil {
if errors.Is(err, db.ErrorNotFound) {
w.WriteHeader(http.StatusNotFound)
return
}
log.Printf("Can't get member %d: %v", num, err)
w.WriteHeader(http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusOK)
err = json.NewEncoder(w).Encode(member)
if err != nil {
log.Printf("Can't encode member: %v", err)
w.WriteHeader(http.StatusInternalServerError)
return
}
}
func (a *api) DeleteMember(w http.ResponseWriter, req *http.Request) {
vars := mux.Vars(req)
num, _ := strconv.Atoi(vars["num"])
err := a.db.DeleteMember(num)
if err != nil {
log.Printf("Can't delete member %s: %v", vars["num"], err)
w.WriteHeader(http.StatusInternalServerError)
return
}
w.WriteHeader(http.StatusOK)
}
func (a *api) UpdateMember(w http.ResponseWriter, req *http.Request) {
var member db.MemberReq
err := json.NewDecoder(req.Body).Decode(&member)
if err != nil {
log.Printf("Can't decode member: %v", err)
w.WriteHeader(http.StatusInternalServerError)
return
}
vars := mux.Vars(req)
num, err := strconv.Atoi(vars["num"])
if err != nil {
log.Printf("Invalid member num %s: %v", vars["num"], err)
w.WriteHeader(http.StatusInternalServerError)
return
}
m, err := a.db.UpdateMember(num, member, false)
if err != nil {
if errors.Is(err, db.ErrorNotFound) {
w.WriteHeader(http.StatusNotFound)
return
}
log.Printf("Can't update member %d: %v", num, err)
w.WriteHeader(http.StatusInternalServerError)
return
}
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusAccepted)
err = json.NewEncoder(w).Encode(m)
if err != nil {
log.Printf("Can't encode updated member: %v", err)
w.WriteHeader(http.StatusInternalServerError)
return
}
}
func (a *api) UpdateMemberMe(num int, w http.ResponseWriter, req *http.Request) {
var member db.MemberReq
err := json.NewDecoder(req.Body).Decode(&member)
if err != nil {
log.Printf("Can't decode member: %v", err)
w.WriteHeader(http.StatusInternalServerError)
return
}
member.Num = 0
member.Role = ""
m, err := a.db.UpdateMember(num, member, true)
if err != nil {
if errors.Is(err, db.ErrorNotFound) {
w.WriteHeader(http.StatusNotFound)
} else if errors.Is(err, db.ErrorBadPassword) {
w.WriteHeader(http.StatusBadRequest)
} else {
log.Printf("Can't update member %d: %v", num, err)
w.WriteHeader(http.StatusInternalServerError)
}
return
}
w.Header().Set("Content-Type", "application/json")
w.WriteHeader(http.StatusAccepted)
err = json.NewEncoder(w).Encode(m)
if err != nil {
log.Printf("Can't encode updated member: %v", err)
w.WriteHeader(http.StatusInternalServerError)
return
}
}