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	"time"
  8
  9	"github.com/gorilla/mux"
 10	"gopkg.in/mgo.v2/bson"
 11)
 12
 13type Post struct {
 14	ID       bson.ObjectId `json:"id" bson:"_id,omitempty"`
 15	Title    string        `json:"title"`
 16	Summary  string        `json:"summary"`
 17	Date     time.Time     `json:"date"`
 18	ThumbImg string        `json:"thumbimg"`
 19	Content  string        `json:"content"`
 20	User     User          `json:"user"`
 21}
 22type User struct {
 23	ID          bson.ObjectId `json:"id" bson:"_id,omitempty"`
 24	Username    string        `json:"username"`
 25	Name        string        `json:"name"`
 26	LastName    string        `json:"lastname"`
 27	Twitter     string        `json:"twitter" bson:",omitempty"`
 28	Description string        `json:"description" bson:",omitempty"`
 29	Email       string        `json:"email" bson:",omitempty"`
 30	Password    string        `json:"password" bson:",omitempty"`
 31	Token       string        `json:"token" bson:",omitempty"`
 32	Posts       []Post        `json:"posts" bson:",omitempty"`
 33}
 34
 35func Index(w http.ResponseWriter, r *http.Request) {
 36	fmt.Fprintln(w, "clientApp")
 37}
 38
 39func Signup(w http.ResponseWriter, r *http.Request) {
 40	decoder := json.NewDecoder(r.Body)
 41	var user User
 42	err := decoder.Decode(&user)
 43	if err != nil {
 44		panic(err)
 45	}
 46	defer r.Body.Close()
 47
 48	fmt.Print("user signup: ")
 49	fmt.Println(user.Username)
 50
 51	//save the new project to mongodb
 52	rUser := User{}
 53	err = userCollection.Find(bson.M{"email": user.Email}).One(&rUser)
 54	if err != nil {
 55		//user not exists
 56		err = userCollection.Insert(user)
 57		err = userCollection.Find(bson.M{"email": user.Email}).One(&user)
 58	} else {
 59		//user exists
 60		http.Error(w, "user already registered", http.StatusConflict)
 61		return
 62	}
 63
 64	fmt.Println(user.Username)
 65	jResp, err := json.Marshal(user)
 66	if err != nil {
 67		panic(err)
 68	}
 69	fmt.Fprintln(w, string(jResp))
 70}
 71
 72func Login(w http.ResponseWriter, r *http.Request) {
 73
 74	decoder := json.NewDecoder(r.Body)
 75	var user User
 76	err := decoder.Decode(&user)
 77	if err != nil {
 78		panic(err)
 79	}
 80	defer r.Body.Close()
 81	//TODO check if the user password exists in the database
 82
 83	fmt.Print("user login: ")
 84	fmt.Println(user)
 85
 86	//save the new project to mongodb
 87	rUser := User{}
 88	err = userCollection.Find(bson.M{"email": user.Email}).One(&rUser)
 89	if err != nil {
 90		http.Error(w, "error login, email not foun", http.StatusConflict)
 91		return
 92	}
 93	//user exists, check password
 94	if user.Password != rUser.Password {
 95		http.Error(w, "error login, password not match", http.StatusConflict)
 96		return
 97	}
 98
 99	token, err := newToken()
100	check(err)
101	rUser.Token = token
102
103	//update with the token
104	err = userCollection.Update(bson.M{"_id": rUser.ID}, rUser)
105	check(err)
106
107	jResp, err := json.Marshal(rUser)
108	if err != nil {
109		panic(err)
110	}
111	fmt.Fprintln(w, string(jResp))
112}
113
114func GetUsers(w http.ResponseWriter, r *http.Request) {
115	//get projects from mongodb
116	users := []User{}
117	err := userCollection.Find(bson.M{}).Limit(50).All(&users)
118	check(err)
119
120	jResp, err := json.Marshal(users)
121	check(err)
122	fmt.Fprintln(w, string(jResp))
123}
124func GetUser(w http.ResponseWriter, r *http.Request) {
125	vars := mux.Vars(r)
126	userid := vars["userid"]
127
128	//get projects from mongodb
129	user := User{}
130	err := userCollection.Find(bson.M{"_id": bson.ObjectIdHex(userid)}).One(&user)
131	check(err)
132
133	err = postCollection.Find(bson.M{"user._id": bson.ObjectIdHex(userid)}).Limit(50).All(&user.Posts)
134	check(err)
135
136	jResp, err := json.Marshal(user)
137	check(err)
138	fmt.Fprintln(w, string(jResp))
139}
140func NewPost(w http.ResponseWriter, r *http.Request) {
141	decoder := json.NewDecoder(r.Body)
142	var post Post
143	err := decoder.Decode(&post)
144	if err != nil {
145		panic(err)
146	}
147	defer r.Body.Close()
148
149	//get user by token
150	usertoken := r.Header.Get("Authorization")
151	user := User{}
152	err = userCollection.Find(bson.M{"token": usertoken}).One(&user)
153	check(err)
154
155	//add date to post
156	post.Date = time.Now()
157
158	//add user.id to post.user
159	post.User.ID = user.ID
160	err = postCollection.Insert(post)
161	check(err)
162
163	//get user
164	//user = User{}
165	err = userCollection.Find(bson.M{"token": usertoken}).One(&user)
166	check(err)
167
168	jResp, err := json.Marshal(user)
169	if err != nil {
170		panic(err)
171	}
172	fmt.Fprintln(w, string(jResp))
173}
174
175func GetPosts(w http.ResponseWriter, r *http.Request) {
176	//get projects from mongodb
177	posts := []Post{}
178	err := postCollection.Find(bson.M{}).Limit(50).All(&posts)
179	check(err)
180
181	jResp, err := json.Marshal(posts)
182	check(err)
183	fmt.Fprintln(w, string(jResp))
184}
185func GetPost(w http.ResponseWriter, r *http.Request) {
186	vars := mux.Vars(r)
187	postid := vars["postid"]
188
189	//get projects from mongodb
190	post := Post{}
191	err := postCollection.Find(bson.M{"_id": bson.ObjectIdHex(postid)}).One(&post)
192	check(err)
193
194	err = userCollection.Find(bson.M{"_id": post.User.ID}).One(&post.User)
195	check(err)
196
197	jResp, err := json.Marshal(post)
198	check(err)
199	fmt.Fprintln(w, string(jResp))
200}