You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 

234 lines
5.7 KiB

package main
import (
"encoding/json"
"fmt"
"io/ioutil"
"log"
"net/http"
"os/exec"
"strings"
"time"
"github.com/fatih/color"
"github.com/gorilla/mux"
"gopkg.in/mgo.v2/bson"
)
type Post struct {
ID bson.ObjectId `json:"id" bson:"_id,omitempty"`
Title string `json:"title"`
Summary string `json:"summary"`
Date time.Time `json:"date"`
ThumbImg string `json:"thumbimg"`
Content string `json:"content"`
User User `json:"user"`
}
type User struct {
ID bson.ObjectId `json:"id" bson:"_id,omitempty"`
Username string `json:"username"`
Name string `json:"name"`
LastName string `json:"lastname"`
Twitter string `json:"twitter" bson:",omitempty"`
Description string `json:"description" bson:",omitempty"`
Email string `json:"email" bson:",omitempty"`
Password string `json:"password" bson:",omitempty"`
Token string `json:"token" bson:",omitempty"`
Posts []Post `json:"posts" bson:",omitempty"`
}
func Index(w http.ResponseWriter, r *http.Request) {
fmt.Fprintln(w, "clientApp")
}
func Signup(w http.ResponseWriter, r *http.Request) {
decoder := json.NewDecoder(r.Body)
var user User
err := decoder.Decode(&user)
if err != nil {
panic(err)
}
defer r.Body.Close()
fmt.Print("user signup: ")
fmt.Println(user.Username)
//save the new project to mongodb
rUser := User{}
err = userCollection.Find(bson.M{"email": user.Email}).One(&rUser)
if err != nil {
//user not exists
err = userCollection.Insert(user)
err = userCollection.Find(bson.M{"email": user.Email}).One(&user)
} else {
//user exists
http.Error(w, "user already registered", http.StatusConflict)
return
}
fmt.Println(user.Username)
jResp, err := json.Marshal(user)
if err != nil {
panic(err)
}
fmt.Fprintln(w, string(jResp))
}
func Login(w http.ResponseWriter, r *http.Request) {
decoder := json.NewDecoder(r.Body)
var user User
err := decoder.Decode(&user)
if err != nil {
panic(err)
}
defer r.Body.Close()
//TODO check if the user password exists in the database
fmt.Print("user login: ")
fmt.Println(user)
//save the new project to mongodb
rUser := User{}
err = userCollection.Find(bson.M{"email": user.Email}).One(&rUser)
if err != nil {
http.Error(w, "error login, email not foun", http.StatusConflict)
return
}
//user exists, check password
if user.Password != rUser.Password {
http.Error(w, "error login, password not match", http.StatusConflict)
return
}
token, err := newToken()
check(err)
rUser.Token = token
//update with the token
err = userCollection.Update(bson.M{"_id": rUser.ID}, rUser)
check(err)
jResp, err := json.Marshal(rUser)
if err != nil {
panic(err)
}
fmt.Fprintln(w, string(jResp))
}
func GetUsers(w http.ResponseWriter, r *http.Request) {
//get projects from mongodb
users := []User{}
err := userCollection.Find(bson.M{}).Limit(50).All(&users)
check(err)
jResp, err := json.Marshal(users)
check(err)
fmt.Fprintln(w, string(jResp))
}
func GetUser(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
userid := vars["userid"]
//get projects from mongodb
user := User{}
err := userCollection.Find(bson.M{"_id": bson.ObjectIdHex(userid)}).One(&user)
check(err)
err = postCollection.Find(bson.M{"user._id": bson.ObjectIdHex(userid)}).Limit(50).All(&user.Posts)
check(err)
//for each post, get the user
for i, _ := range user.Posts {
err = userCollection.Find(bson.M{"_id": user.Posts[i].User.ID}).One(&user.Posts[i].User)
check(err)
//TODO don't return the user.Token, password, etc only the Name, LastName, Username, img
}
jResp, err := json.Marshal(user)
check(err)
fmt.Fprintln(w, string(jResp))
}
func NewPost(w http.ResponseWriter, r *http.Request) {
decoder := json.NewDecoder(r.Body)
var post Post
err := decoder.Decode(&post)
if err != nil {
panic(err)
}
defer r.Body.Close()
//get user by token
usertoken := r.Header.Get("Authorization")
user := User{}
err = userCollection.Find(bson.M{"token": usertoken}).One(&user)
check(err)
//save the post.Content into an html file
err = ioutil.WriteFile(postsDir+"/"+"file.html", []byte(post.Content), 0644)
check(err)
//add the html file to ipfs
out, err := exec.Command("bash", "-c", "ipfs add "+postsDir+"/file.html").Output()
if err != nil {
log.Fatal(err)
}
fmt.Println(out)
hash := strings.Split(string(out), " ")[1]
color.Blue(hash)
//save the hash to the post.content
post.Content = hash
//add date to post
post.Date = time.Now()
//add user.id to post.user
post.User.ID = user.ID
err = postCollection.Insert(post)
check(err)
//get user
//user = User{}
err = userCollection.Find(bson.M{"token": usertoken}).One(&user)
check(err)
jResp, err := json.Marshal(user)
if err != nil {
panic(err)
}
fmt.Fprintln(w, string(jResp))
}
func GetPosts(w http.ResponseWriter, r *http.Request) {
//get projects from mongodb
posts := []Post{}
err := postCollection.Find(bson.M{}).Limit(50).All(&posts)
check(err)
//for each post, get the user
for i, _ := range posts {
fmt.Println(posts[i].User.ID)
err = userCollection.Find(bson.M{"_id": posts[i].User.ID}).One(&posts[i].User)
check(err)
//TODO don't return the user.Token, password, etc only the Name, LastName, Username, img
}
jResp, err := json.Marshal(posts)
check(err)
fmt.Fprintln(w, string(jResp))
}
func GetPost(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
postid := vars["postid"]
//get projects from mongodb
post := Post{}
err := postCollection.Find(bson.M{"_id": bson.ObjectIdHex(postid)}).One(&post)
check(err)
err = userCollection.Find(bson.M{"_id": post.User.ID}).One(&post.User)
check(err)
jResp, err := json.Marshal(post)
check(err)
fmt.Fprintln(w, string(jResp))
}