initial api work
This commit is contained in:
commit
f960eab641
63
backend/addViews.go
Normal file
63
backend/addViews.go
Normal file
@ -0,0 +1,63 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"io/ioutil"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"github.com/gorilla/mux"
|
||||
)
|
||||
|
||||
func addMovie(w http.ResponseWriter, r *http.Request) {
|
||||
var newmov Movie
|
||||
reqBody, err := ioutil.ReadAll(r.Body)
|
||||
if err != nil {
|
||||
fmt.Fprintf(w, "Please enter a movie")
|
||||
}
|
||||
json.Unmarshal(reqBody, &newmov)
|
||||
fmt.Println(newmov)
|
||||
mov, err := db.CreateMovie(newmov.Title, newmov.Imdb)
|
||||
if err != nil || mov.ID == 0 {
|
||||
fmt.Fprintf(w, "Error creating movie")
|
||||
return
|
||||
}
|
||||
|
||||
w.WriteHeader(http.StatusCreated)
|
||||
json.NewEncoder(w).Encode(mov)
|
||||
}
|
||||
|
||||
func addTaggedMovie(w http.ResponseWriter, r *http.Request) {
|
||||
movieIDstr := mux.Vars(r)["mid"]
|
||||
tagIDstr := mux.Vars(r)["tid"]
|
||||
movieID, err := strconv.Atoi(movieIDstr)
|
||||
if err != nil {
|
||||
fmt.Fprintf(w, "Error: invalid movie ID passed")
|
||||
return
|
||||
}
|
||||
tagID, err := strconv.Atoi(tagIDstr)
|
||||
if err != nil {
|
||||
fmt.Fprintf(w, "Error: invalid tag ID passed")
|
||||
return
|
||||
}
|
||||
err = db.TagMovie(tagID, movieID)
|
||||
if err != nil {
|
||||
fmt.Fprintf(w, "Error tagging movie")
|
||||
}
|
||||
json.NewEncoder(w).Encode("tagged")
|
||||
}
|
||||
|
||||
func addTag(w http.ResponseWriter, r *http.Request) {
|
||||
var newtag Tag
|
||||
reqBody, err := ioutil.ReadAll(r.Body)
|
||||
if err != nil {
|
||||
fmt.Fprintf(w, "Please enter a tag")
|
||||
}
|
||||
json.Unmarshal(reqBody, &newtag)
|
||||
|
||||
tag, _ := db.CreateTag(newtag.Name)
|
||||
|
||||
w.WriteHeader(http.StatusCreated)
|
||||
json.NewEncoder(w).Encode(tag)
|
||||
}
|
60
backend/delViews.go
Normal file
60
backend/delViews.go
Normal file
@ -0,0 +1,60 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"github.com/gorilla/mux"
|
||||
)
|
||||
|
||||
func delOneMovie(w http.ResponseWriter, r *http.Request) {
|
||||
movieIDstr := mux.Vars(r)["id"]
|
||||
movieID, err := strconv.Atoi(movieIDstr)
|
||||
if err != nil {
|
||||
fmt.Fprintf(w, "Error: invalid movie ID passed")
|
||||
return
|
||||
}
|
||||
err = db.DeleteMovie(movieID)
|
||||
if err != nil {
|
||||
fmt.Fprintf(w, "Error deleting movie")
|
||||
return
|
||||
}
|
||||
fmt.Fprintf(w, "Movie deleted succesfully")
|
||||
}
|
||||
|
||||
func delOneTag(w http.ResponseWriter, r *http.Request) {
|
||||
tagIDstr := mux.Vars(r)["id"]
|
||||
tagID, err := strconv.Atoi(tagIDstr)
|
||||
if err != nil {
|
||||
fmt.Fprintf(w, "Error: invalid tag ID passed")
|
||||
return
|
||||
}
|
||||
err = db.DeleteTag(tagID)
|
||||
if err != nil {
|
||||
fmt.Fprintf(w, "Error deleting tag")
|
||||
return
|
||||
}
|
||||
fmt.Fprintf(w, "Tag deleted succesfully")
|
||||
}
|
||||
|
||||
func delTaggedMovie(w http.ResponseWriter, r *http.Request) {
|
||||
movieIDstr := mux.Vars(r)["mid"]
|
||||
tagIDstr := mux.Vars(r)["tid"]
|
||||
movieID, err := strconv.Atoi(movieIDstr)
|
||||
if err != nil {
|
||||
fmt.Fprintf(w, "Error: invalid movie ID passed")
|
||||
return
|
||||
}
|
||||
tagID, err := strconv.Atoi(tagIDstr)
|
||||
if err != nil {
|
||||
fmt.Fprintf(w, "Error: invalid tag ID passed")
|
||||
return
|
||||
}
|
||||
err = db.UnTagMovie(tagID, movieID)
|
||||
if err != nil {
|
||||
fmt.Fprintf(w, "Error untagging movie")
|
||||
return
|
||||
}
|
||||
fmt.Fprintf(w, "Untagged movie")
|
||||
}
|
78
backend/getViews.go
Normal file
78
backend/getViews.go
Normal file
@ -0,0 +1,78 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
"log"
|
||||
"net/http"
|
||||
"strconv"
|
||||
|
||||
"github.com/gorilla/mux"
|
||||
)
|
||||
|
||||
func homeLink(w http.ResponseWriter, r *http.Request) {
|
||||
movies, err := db.GetMovies()
|
||||
if err != nil {
|
||||
log.Fatal("Error showing homepage (all movies)")
|
||||
}
|
||||
json.NewEncoder(w).Encode(movies)
|
||||
}
|
||||
|
||||
func getMovies(w http.ResponseWriter, r *http.Request) {
|
||||
movies, err := db.GetMovies()
|
||||
if err != nil {
|
||||
log.Fatal("Error getting all movies")
|
||||
}
|
||||
json.NewEncoder(w).Encode(movies)
|
||||
}
|
||||
|
||||
func getOneMovie(w http.ResponseWriter, r *http.Request) {
|
||||
movieIDstr := mux.Vars(r)["id"]
|
||||
movieID, err := strconv.Atoi(movieIDstr)
|
||||
if err != nil {
|
||||
log.Println("Error: invalid movie ID passed")
|
||||
return
|
||||
}
|
||||
mov, err := db.GetMovieById(movieID)
|
||||
if err != nil {
|
||||
log.Fatal("Error getting one movie")
|
||||
}
|
||||
json.NewEncoder(w).Encode(mov)
|
||||
}
|
||||
|
||||
func getTaggedMovies(w http.ResponseWriter, r *http.Request) {
|
||||
tagIDstr := mux.Vars(r)["id"]
|
||||
tagID, err := strconv.Atoi(tagIDstr)
|
||||
if err != nil {
|
||||
fmt.Fprintf(w, "Error: invalid tag ID passed")
|
||||
return
|
||||
}
|
||||
movies, err := db.GetMoviesByTag(tagID)
|
||||
if err != nil {
|
||||
fmt.Fprintf(w, "Error fetching movies by tag")
|
||||
return
|
||||
}
|
||||
json.NewEncoder(w).Encode(movies)
|
||||
}
|
||||
|
||||
func getTags(w http.ResponseWriter, r *http.Request) {
|
||||
tags, err := db.GetTags()
|
||||
if err != nil {
|
||||
log.Fatal("Error getting all tags")
|
||||
}
|
||||
json.NewEncoder(w).Encode(tags)
|
||||
}
|
||||
|
||||
func getOneTag(w http.ResponseWriter, r *http.Request) {
|
||||
tagIDstr := mux.Vars(r)["id"]
|
||||
tagID, err := strconv.Atoi(tagIDstr)
|
||||
if err != nil {
|
||||
log.Println("Error: invalid tag ID passed")
|
||||
return
|
||||
}
|
||||
tag, err := db.GetTagById(tagID)
|
||||
if err != nil {
|
||||
log.Fatal("Error getting one tag")
|
||||
}
|
||||
json.NewEncoder(w).Encode(tag)
|
||||
}
|
49
backend/main.go
Normal file
49
backend/main.go
Normal file
@ -0,0 +1,49 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"log"
|
||||
"net/http"
|
||||
|
||||
"github.com/gorilla/mux"
|
||||
)
|
||||
|
||||
var db MovieDB
|
||||
|
||||
func main() {
|
||||
setupDB()
|
||||
router := mux.NewRouter().StrictSlash(true)
|
||||
router.HandleFunc("/", homeLink)
|
||||
router.HandleFunc("/movie", getMovies).Methods("GET")
|
||||
router.HandleFunc("/movie", addMovie).Methods("POST")
|
||||
router.HandleFunc("/movie/{id}", getOneMovie).Methods("GET")
|
||||
router.HandleFunc("/movie/{id}", delOneMovie).Methods("DELETE")
|
||||
|
||||
router.HandleFunc("/movie/tag/{id}", getTaggedMovies).Methods("GET")
|
||||
router.HandleFunc("/movie/{mid}/tag/{tid}", addTaggedMovie).Methods("POST")
|
||||
router.HandleFunc("/movie/{mid}/tag/{tid}", delTaggedMovie).Methods("DELETE")
|
||||
|
||||
router.HandleFunc("/tag", getTags).Methods("GET")
|
||||
router.HandleFunc("/tag", addTag).Methods("POST")
|
||||
router.HandleFunc("/tag/{id}", getOneTag).Methods("GET")
|
||||
router.HandleFunc("/tag/{id}", delOneTag).Methods("DELETE")
|
||||
|
||||
log.Fatal(http.ListenAndServe(":8080", router))
|
||||
}
|
||||
|
||||
func setupDB() {
|
||||
db = CreateMemDB()
|
||||
id1, _ := db.CreateMovie("Murder By Death", "tt0074937")
|
||||
id2, _ := db.CreateMovie("Satanic Panic", "tt8510350")
|
||||
id3, _ := db.CreateMovie("Event Horizon", "tt0119081")
|
||||
id4, _ := db.CreateMovie("Shrek", "tt0126029")
|
||||
fmt.Printf("Created %v %v %v %v\n", id1, id2, id3, id4)
|
||||
t1, _ := db.CreateTag("deea")
|
||||
t2, _ := db.CreateTag("steve")
|
||||
t3, _ := db.CreateTag("bad")
|
||||
fmt.Printf("Created tags %v %v %v\n", t1, t2, t3)
|
||||
db.TagMovie(t1.ID, id1.ID)
|
||||
db.TagMovie(t2.ID, id2.ID)
|
||||
db.TagMovie(t3.ID, id3.ID)
|
||||
db.TagMovie(t3.ID, id4.ID)
|
||||
}
|
146
backend/mem.go
Normal file
146
backend/mem.go
Normal file
@ -0,0 +1,146 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"errors"
|
||||
)
|
||||
|
||||
type MemDB struct {
|
||||
MovieList map[int]*Movie
|
||||
TagList map[int]*Tag
|
||||
TagToMovie map[string][]int
|
||||
mId int
|
||||
tId int
|
||||
}
|
||||
|
||||
func CreateMemDB() *MemDB {
|
||||
return &MemDB{make(map[int]*Movie), make(map[int]*Tag), make(map[string][]int), 1, 1}
|
||||
}
|
||||
|
||||
func (m *MemDB) CreateMovie(title, imdb string) (Movie, error) {
|
||||
mov := Movie{m.mId, title, imdb, []*Tag{}}
|
||||
m.MovieList[m.mId] = &mov
|
||||
m.mId = m.mId + 1
|
||||
return mov, nil
|
||||
}
|
||||
|
||||
func (m *MemDB) UpdateMovie(id int, title string, imdb string) error {
|
||||
m.MovieList[id].Title = title
|
||||
m.MovieList[id].Imdb = imdb
|
||||
return nil
|
||||
}
|
||||
func (m *MemDB) GetMovies(limit ...int) ([]Movie, error) {
|
||||
lim := -1
|
||||
var res []Movie
|
||||
if len(limit) > 0 {
|
||||
lim = limit[0]
|
||||
}
|
||||
count := 0
|
||||
for _, mov := range m.MovieList {
|
||||
if count == lim {
|
||||
break
|
||||
}
|
||||
res = append(res, *mov)
|
||||
}
|
||||
return res, nil
|
||||
}
|
||||
|
||||
func (m *MemDB) GetMovieById(id int) (Movie, error) {
|
||||
mov := m.MovieList[id]
|
||||
if mov.ID == 0 {
|
||||
return *mov, errors.New("No movie found!")
|
||||
} else {
|
||||
return *mov, nil
|
||||
}
|
||||
}
|
||||
|
||||
func (m *MemDB) GetMoviesByTag(id int) ([]Movie, error) {
|
||||
tag := m.TagList[id]
|
||||
if tag.Name == "" {
|
||||
return []Movie{}, nil //nonexistent tag is a valid option
|
||||
}
|
||||
var res []Movie
|
||||
movies := m.TagToMovie[tag.Name]
|
||||
for _, movID := range movies {
|
||||
res = append(res, *m.MovieList[movID])
|
||||
}
|
||||
return res, nil
|
||||
}
|
||||
|
||||
func (m *MemDB) DeleteMovie(id int) error {
|
||||
delete(m.MovieList, id)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *MemDB) CreateTag(name string) (Tag, error) {
|
||||
tag := Tag{m.tId, name}
|
||||
m.TagList[m.tId] = &tag
|
||||
m.tId = m.tId + 1
|
||||
return tag, nil
|
||||
}
|
||||
|
||||
func (m *MemDB) DeleteTag(id int) error {
|
||||
tag := m.TagList[id]
|
||||
delete(m.TagList, id)
|
||||
delete(m.TagToMovie, tag.Name)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *MemDB) GetTags(limit ...int) ([]Tag, error) {
|
||||
lim := -1
|
||||
var res []Tag
|
||||
if len(limit) > 0 {
|
||||
lim = limit[0]
|
||||
}
|
||||
count := 0
|
||||
for _, tag := range m.TagList {
|
||||
if count == lim {
|
||||
break
|
||||
}
|
||||
res = append(res, *tag)
|
||||
}
|
||||
return res, nil
|
||||
}
|
||||
|
||||
func (m *MemDB) GetTagById(id int) (Tag, error) {
|
||||
tag := m.TagList[id]
|
||||
if tag.ID == 0 {
|
||||
return *tag, errors.New("No tag found!")
|
||||
} else {
|
||||
return *tag, nil
|
||||
}
|
||||
}
|
||||
|
||||
func (m *MemDB) TagMovie(tagId int, movieId int) error {
|
||||
mov := m.MovieList[movieId]
|
||||
tag := m.TagList[tagId]
|
||||
if mov.ID == 0 {
|
||||
return errors.New("No movie found for tagging!")
|
||||
}
|
||||
if tag.ID == 0 {
|
||||
return errors.New("No tag found for tagging!")
|
||||
}
|
||||
m.TagToMovie[tag.Name] = append(m.TagToMovie[tag.Name], movieId)
|
||||
mov.Tags = append(mov.Tags, tag)
|
||||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *MemDB) UnTagMovie(tagId int, movieId int) error {
|
||||
mov := m.MovieList[movieId]
|
||||
tag := m.TagList[tagId]
|
||||
if mov.ID == 0 {
|
||||
return errors.New("No movie found for untagging!")
|
||||
}
|
||||
if tag.ID == 0 {
|
||||
return errors.New("No tag found for untagging!")
|
||||
}
|
||||
for i, v := range m.TagToMovie[tag.Name] {
|
||||
if v == movieId {
|
||||
m.TagToMovie[tag.Name][i] = m.TagToMovie[tag.Name][len(m.TagToMovie[tag.Name])-1]
|
||||
m.TagToMovie[tag.Name] = m.TagToMovie[tag.Name][:len(m.TagToMovie[tag.Name])-1]
|
||||
break
|
||||
}
|
||||
}
|
||||
|
||||
return nil
|
||||
}
|
28
backend/types.go
Normal file
28
backend/types.go
Normal file
@ -0,0 +1,28 @@
|
||||
package main
|
||||
|
||||
type Movie struct {
|
||||
ID int `json:"id"`
|
||||
Title string `json:"title"`
|
||||
Imdb string `json:"imdb"`
|
||||
Tags []*Tag `json:"tags"`
|
||||
}
|
||||
|
||||
type Tag struct {
|
||||
ID int `db:"id" json:"id"`
|
||||
Name string `db:"name" json:"name"`
|
||||
}
|
||||
|
||||
type MovieDB interface {
|
||||
CreateMovie(title string, imdb string) (Movie, error)
|
||||
UpdateMovie(id int, title string, imbd string) error
|
||||
GetMovies(limit ...int) ([]Movie, error)
|
||||
GetMovieById(id int) (Movie, error)
|
||||
GetMoviesByTag(id int) ([]Movie, error)
|
||||
DeleteMovie(id int) error
|
||||
CreateTag(name string) (Tag, error)
|
||||
DeleteTag(id int) error
|
||||
GetTags(limit ...int) ([]Tag, error)
|
||||
GetTagById(id int) (Tag, error)
|
||||
TagMovie(tagId int, movieId int) error
|
||||
UnTagMovie(tagId int, movieId int) error
|
||||
}
|
Loading…
Reference in New Issue
Block a user