Initial commit

Initial commit
This commit is contained in:
Guillermo Serrahima Poncet 2019-11-05 18:39:30 +01:00
commit 4fe6fed8c4
3 changed files with 118 additions and 0 deletions

3
README.md Normal file
View file

@ -0,0 +1,3 @@
# Gochat
Experiment to practice Golang for the first time following the "REST API with Mux" tutorial [here](https://www.youtube.com/watch?v=SonwZ6MF5BE).

BIN
gochat Executable file

Binary file not shown.

115
main.go Normal file
View file

@ -0,0 +1,115 @@
package main
import (
"encoding/json"
"fmt"
"github.com/gorilla/mux"
"log"
"math/rand"
"net/http"
"strconv"
"time"
)
// Message struct
type Text struct {
Content string `json:"content"`
Author string `json:"author"`
}
type Message struct {
Id string `json:"id"`
Content Text `json:"content"`
}
// Chat as a slice of Messages
var chat []Message
// Possible Messages
var quickchat []string
//Possible authors
var users []string
var idCount int
func getChat(writer http.ResponseWriter, request *http.Request) {
writer.Header().Set("Content-Type", "application/json")
json.NewEncoder(writer).Encode(chat)
}
func getMsg(writer http.ResponseWriter, request *http.Request) {
writer.Header().Set("Content-Type", "application/json")
params := mux.Vars(request)
for _, msg := range chat {
if msg.Id == params["id"] {
json.NewEncoder(writer).Encode(msg)
return
}
}
}
func createMsg() (string, string) {
content := quickchat[rand.Intn(len(quickchat))]
author := users[rand.Intn(len(users))]
return content, author
}
func sendMsg(writer http.ResponseWriter, request *http.Request) {
writer.Header().Set("Content-Type", "application/json")
var newMsg Message
_ = json.NewDecoder(request.Body).Decode(&(newMsg.Content))
newMsg.Id = strconv.Itoa(idCount)
idCount++
chat = append(chat, newMsg)
json.NewEncoder(writer).Encode(newMsg)
fmt.Println("New Message:")
fmt.Println("#", newMsg.Id, newMsg.Content.Author, ":", newMsg.Content.Content)
}
func editMsg(writer http.ResponseWriter, request *http.Request) {
writer.Header().Set("Content-Type", "application/json")
}
func deleteMsg(writer http.ResponseWriter, request *http.Request) {
writer.Header().Set("Content-Type", "application/json")
params := mux.Vars(request)
for index, msg := range chat {
if msg.Id == params["id"] {
chat = append(chat[:index], chat[index+1:]...)
break
}
}
json.NewEncoder(writer).Encode(chat)
}
func main() {
// Init rand
rand.Seed(time.Now().Unix())
// Init server router
router := mux.NewRouter()
// Init chat variables
quickchat = []string{"Wow!", "OMG!", "Nice shot!", "What a save!", "Sorry!", "My bad."}
users = []string{"Chipper", "Beast", "Jester", "Merlin", "Bandit", "Rainmaker"}
first := Message{"0", Text{"The chat room is open.", "SERVER"}}
chat = append(chat, first)
idCount = 1
// Handlers
router.HandleFunc("/api/chat", getChat).Methods("GET")
router.HandleFunc("/api/chat/{id}", getMsg).Methods("GET")
router.HandleFunc("/api/chat", sendMsg).Methods("POST")
router.HandleFunc("/api/chat/{id}", editMsg).Methods("PUT")
router.HandleFunc("/api/chat/{id}", deleteMsg).Methods("DELETE")
// Log
log.Fatal(http.ListenAndServe(":8000", router))
last := Message{"-1", Text{"The chat room is closed.", "SERVER"}}
chat = append(chat, last)
return
}