From 3df71a83023499ca82af3d880837592f4e9a3d79 Mon Sep 17 00:00:00 2001 From: AustrianToast Date: Sun, 19 May 2024 00:19:47 +0200 Subject: [PATCH] can now create and read --- main.go | 180 ++++++++++++++++++++------------------------------------ 1 file changed, 64 insertions(+), 116 deletions(-) diff --git a/main.go b/main.go index 211a991..f94e8af 100644 --- a/main.go +++ b/main.go @@ -14,17 +14,11 @@ import ( "github.com/jaswdr/faker" ) -// This is taken from our DB model -type video struct { - ID int `json:"id"` - Filepath string `json:"filepath"` -} - -// videos slice to seed record video data. -var videos []video +var dbpool *pgxpool.Pool func main() { - dbpool, err := pgxpool.New(context.Background(), "postgresql://postgres:postgres@172.19.0.2:5432/postgres") + var err error + dbpool, err = pgxpool.New(context.Background(), "postgresql://postgres:postgres@172.19.0.2:5432/postgres") if err != nil { log.Fatal(err) } @@ -35,7 +29,7 @@ func main() { CREATE TABLE IF NOT EXISTS public.videos ( - id integer NOT NULL, + id serial NOT NULL, filepath text, CONSTRAINT videos_pkey PRIMARY KEY (id) ) @@ -53,70 +47,42 @@ func main() { faker := faker.New() for i := 0; i < 10; i++ { - sqlStmt = fmt.Sprintf("insert into public.videos(id, filepath) values(%d, '%s')", i, faker.File().AbsoluteFilePathForUnix(2)) + sqlStmt = fmt.Sprintf("insert into public.videos(filepath) values('%s')", faker.File().AbsoluteFilePathForUnix(2)) _, err = dbpool.Exec(context.Background(), sqlStmt) if err != nil { log.Fatalf("Unable to add videos: %v\n", err) } } - rows, _ := dbpool.Query(context.Background(), "select * from videos") - for rows.Next() { - var id int - var name string - err = rows.Scan(&id, &name) - if err != nil { - log.Fatalf("Unable to list videos: %v\n", err) - } - fmt.Println(id, name) - } - err = rows.Err() - if err != nil { - log.Fatalf("Unable to list videos: %v\n", err) - } - - // Legacy - for i := 0; i < 10; i++ { - videos = append(videos, video{ID: i, Filepath: faker.File().AbsoluteFilePathForUnix(5)}) - } - router := gin.Default() router.SetTrustedProxies(nil) - router.POST("/upload", ReceiveFile) - router.GET("/videos", getvideos) - router.GET("/videos/:id", getvideoByID) - router.POST("/videos", postvideos) - router.DELETE("/videos", delvideos) - router.DELETE("/videos/:id", delvideoByID) - router.PATCH("/videos/:id", updatevideo) + router.POST("/video", ReceiveChunk) + router.POST("/video/completed", ReceiveFile) + router.GET("/videos", listVideos) + router.GET("/videos/:id", getVideo) router.Run("localhost:8080") } -func remove(slice []video, s int) []video { - return append(slice[:s], slice[s+1:]...) -} - -func ReceiveFile(c *gin.Context) { - // maybe even re-verify mime-type (before or after upload) - - fileName := c.GetHeader("file-name") +func ReceiveChunk(c *gin.Context) { /* get data from request write append data to file */ - data, err := io.ReadAll(c.Request.Body) + chunk, err := io.ReadAll(c.Request.Body) if err != nil { c.IndentedJSON(http.StatusBadRequest, "Unknown Error") return } + fileName := c.GetHeader("file-name") + f, err := os.OpenFile(fileName, os.O_APPEND|os.O_CREATE|os.O_WRONLY, 0644) if err != nil { log.Fatal(err) } - if _, err := f.Write(data); err != nil { + if _, err := f.Write(chunk); err != nil { log.Fatal(err) } if err := f.Close(); err != nil { @@ -126,84 +92,66 @@ func ReceiveFile(c *gin.Context) { c.IndentedJSON(http.StatusOK, "Received chunk") } -// getvideos responds with the list of all videos as JSON. -func getvideos(c *gin.Context) { - c.IndentedJSON(http.StatusOK, videos) -} +func ReceiveFile(c *gin.Context) { + currentDir, err := os.Getwd() + if err != nil { + log.Fatalf("Unable to get current working dir: %v\n", err) + } -// postvideos adds an video from JSON received in the request body. -func postvideos(c *gin.Context) { - var newvideo video - - // Call BindJSON to bind the received JSON to - // newvideo. - if err := c.BindJSON(&newvideo); err != nil { - c.Status(http.StatusBadRequest) + fileName, err := io.ReadAll(c.Request.Body) + if err != nil { + c.IndentedJSON(http.StatusBadRequest, "Unknown Error") return } - for _, a := range videos { - if a == newvideo { - c.Status(http.StatusBadRequest) - return + filepath := fmt.Sprintf("%s/%s", currentDir, fileName) + sqlStmt := fmt.Sprintf("insert into public.videos(filepath) values('%s')", filepath) + _, err = dbpool.Exec(context.Background(), sqlStmt) + if err != nil { + log.Fatalf("Unable to add video: %v\n", err) + } + + c.IndentedJSON(http.StatusOK, "Completed Upload") +} + +func listVideos(c *gin.Context) { + var err error + rows, _ := dbpool.Query(context.Background(), "select * from videos") + for rows.Next() { + var id int + var filepath string + err = rows.Scan(&id, &filepath) + if err != nil { + log.Fatalf("Unable to list videos: %v\n", err) } + fmt.Println(id, filepath) + } + err = rows.Err() + if err != nil { + log.Fatalf("Unable to list videos: %v\n", err) } - - // Add the new video to the slice. - videos = append(videos, newvideo) - c.IndentedJSON(http.StatusCreated, newvideo) } -// getvideoByID locates the video whose ID value matches the id -// parameter sent by the client, then returns that video as a response. -func getvideoByID(c *gin.Context) { - inputId := c.Param("id") +func getVideo(c *gin.Context) { + var err error + inputId, err := strconv.Atoi(c.Param("id")) + if err != nil { + log.Fatal(err) + } + sqlStmt := fmt.Sprintf("select * from videos where id = %d", inputId) - // Loop through the list of videos, looking for - // an video whose ID value matches the parameter. - for _, a := range videos { - if strconv.Itoa(a.ID) == inputId { - c.IndentedJSON(http.StatusOK, a) - return + rows, _ := dbpool.Query(context.Background(), sqlStmt) + for rows.Next() { + var id int + var filepath string + err = rows.Scan(&id, &filepath) + if err != nil { + log.Fatalf("Unable to list videos: %v\n", err) } + fmt.Println(id, filepath) } - c.IndentedJSON(http.StatusNotFound, gin.H{"message": "video not found"}) -} - -func delvideos(c *gin.Context) { - videos = []video{} - c.IndentedJSON(http.StatusOK, videos) -} - -func delvideoByID(c *gin.Context) { - inputId := c.Param("id") - - for s, a := range videos { - if strconv.Itoa(a.ID) == inputId { - videos = remove(videos, s) - c.IndentedJSON(http.StatusCreated, videos) - return - } + err = rows.Err() + if err != nil { + log.Fatalf("Unable to list videos: %v\n", err) } - c.IndentedJSON(http.StatusNotFound, gin.H{"message": "video not found"}) -} - -func updatevideo(c *gin.Context) { - inputId := c.Param("id") - - var newvideo video - - if err := c.BindJSON(&newvideo); err != nil { - return - } - - for s, a := range videos { - if strconv.Itoa(a.ID) == inputId { - videos = remove(videos, s) - videos = append(videos, newvideo) - c.IndentedJSON(http.StatusCreated, newvideo) - return - } - } - c.IndentedJSON(http.StatusNotFound, gin.H{"message": "video not found"}) }