can now create and read

This commit is contained in:
AustrianToast 2024-05-19 00:19:47 +02:00
parent cb437f3bb6
commit 3df71a8302
No known key found for this signature in database
GPG Key ID: 5CD422268E489EB4

180
main.go
View File

@ -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)
}
// Add the new video to the slice.
videos = append(videos, newvideo)
c.IndentedJSON(http.StatusCreated, newvideo)
c.IndentedJSON(http.StatusOK, "Completed Upload")
}
// 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")
// 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
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)
}
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
}
}
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"})
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)
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)
}
err = rows.Err()
if err != nil {
log.Fatalf("Unable to list videos: %v\n", err)
}
}