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}