arnaucube
arnaucube/decentralized-blogging-platformPublic Self-hosted repository
decentralized-blogging-platform/RESTfunctions.go
RESTfunctions.goRaw
 1package main
 2
 3import (
 4	"encoding/json"
 5	"fmt"
 6	"net/http"
 7
 8	"gopkg.in/mgo.v2/bson"
 9)
10
11type User struct {
12	Id       bson.ObjectId `json:"id" bson:"_id,omitempty"`
13	Username string        `json:"username"`
14	Email    string        `json:"email"`
15	Password string        `json:"password"`
16	Token    string        `json:"token"`
17}
18
19func Index(w http.ResponseWriter, r *http.Request) {
20	fmt.Fprintln(w, "clientApp")
21}
22
23func Signup(w http.ResponseWriter, r *http.Request) {
24	decoder := json.NewDecoder(r.Body)
25	var user User
26	err := decoder.Decode(&user)
27	if err != nil {
28		panic(err)
29	}
30	defer r.Body.Close()
31
32	fmt.Print("user signup: ")
33	fmt.Println(user.Username)
34
35	//save the new project to mongodb
36	rUser := User{}
37	err = userCollection.Find(bson.M{"email": user.Email}).One(&rUser)
38	if err != nil {
39		//user not exists
40		err = userCollection.Insert(user)
41		err = userCollection.Find(bson.M{"email": user.Email}).One(&user)
42	} else {
43		//user exists
44		http.Error(w, "user already registered", http.StatusConflict)
45		return
46	}
47
48	fmt.Println(user.Username)
49	jResp, err := json.Marshal(user)
50	if err != nil {
51		panic(err)
52	}
53	fmt.Fprintln(w, string(jResp))
54}
55
56func Login(w http.ResponseWriter, r *http.Request) {
57
58	decoder := json.NewDecoder(r.Body)
59	var user User
60	err := decoder.Decode(&user)
61	if err != nil {
62		panic(err)
63	}
64	defer r.Body.Close()
65	//TODO check if the user password exists in the database
66
67	fmt.Print("user login: ")
68	fmt.Println(user)
69
70	//save the new project to mongodb
71	rUser := User{}
72	err = userCollection.Find(bson.M{"email": user.Email}).One(&rUser)
73	if err != nil {
74		http.Error(w, "error login, email not foun", http.StatusConflict)
75		return
76	}
77	//user exists, check password
78	if user.Password != rUser.Password {
79		http.Error(w, "error login, password not match", http.StatusConflict)
80		return
81	}
82
83	token, err := newToken()
84	check(err)
85	rUser.Token = token
86
87	//update with the token
88	err = userCollection.Update(bson.M{"_id": rUser.Id}, rUser)
89	check(err)
90
91	jResp, err := json.Marshal(rUser)
92	if err != nil {
93		panic(err)
94	}
95	fmt.Fprintln(w, string(jResp))
96}