Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@ POSTGRES_HOST=ecea_db
POSTGRES_PORT=5432
PGDATA=/data/postgres
ADMINER_PORT=8080
ADMINER_DESIGN=pappu687
MAIL_HOST=smtp.gmail.com
MAIL_PORT=465
MAIL_USER=mail@gmail.com
Expand Down
2 changes: 2 additions & 0 deletions config/database.go
Original file line number Diff line number Diff line change
Expand Up @@ -47,6 +47,8 @@ func MigrateDB() {
&schemas.Team{},
&schemas.Role{},
&schemas.Member{},
&schemas.PodcastType{},
&schemas.Podcast{},
} {
if err := db.AutoMigrate(&schema); err != nil {
panic(err)
Expand Down
13 changes: 10 additions & 3 deletions controllers/app_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,10 @@ import (
)

type AppController struct {
User interface{ UserController }
Team interface{ TeamController }
Seed interface{ SeedController }
User interface{ UserController }
Team interface{ TeamController }
Podcast interface{ PodcastController }
Seed interface{ SeedController }
}

type seedController struct {
Expand Down Expand Up @@ -41,6 +42,12 @@ func (s *seedController) SeedDB() error {
log.Panic(err)
return err
}
err = s.seed.PodcastTypesSeeder()
if err != nil {
log.Panic(err)
return err
}

log.Println(color.GreenString("Seeded Successfully"))
return nil
}
291 changes: 291 additions & 0 deletions controllers/podcast_controller.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,291 @@
package controllers

import (
"log"
"net/http"
"strconv"

"github.com/ecea-nitt/ecea-server/middlewares"
"github.com/ecea-nitt/ecea-server/models"
"github.com/ecea-nitt/ecea-server/services"
"github.com/ecea-nitt/ecea-server/utils"
"github.com/fatih/color"
"github.com/labstack/echo/v4"
)

type podcastController struct {
ps services.PodcastService
}

type PodcastController interface {
CreatePodcast(c echo.Context) error
EditThumbnail(c echo.Context) error
EditURL(c echo.Context) error
EditDescription(c echo.Context) error
DeletePodcast(c echo.Context) error
GetPodcast(c echo.Context) error
GetAllPodcasts(c echo.Context) error
GetPodcastByType(c echo.Context) error
}

func NewPodcastController(ps services.PodcastService) PodcastController {
return &podcastController{ps}
}

// CreatePodcast godoc
//
// @Summary Create Podcast
// @Description Adds a new podcast to the database
// @Tags Podcast
// @Accept multipart/form-data
// @Produce json
// @Param name formData string true "Enter name"
// @Param episodeNo formData uint true "Enter episode number"
// @Param type formData models.PodcastType true "Choose a type"
// @Param description formData string true "Enter description"
// @Param mediaURL formData string true "Enter Media URL"
// @Param image formData file true "Upload Thumbnail"
// @Success 200 {object} string
// @Failure 400 {object} models.Error
//
// @Security ApiKeyAuth
// @Router /v1/podcast/create [post]
func (pc *podcastController) CreatePodcast(c echo.Context) error {
request := new(models.PodcastRequest)
if err := c.Bind(request); err != nil {
log.Println(color.RedString(err.Error()))
return middlewares.Responder(c, http.StatusBadRequest, http.StatusText(http.StatusBadRequest))
}

file, err := c.FormFile("image")
if err != nil {
log.Println(color.RedString(err.Error()))
return err
}

err = pc.ps.CreatePodcast(*request, file)
if err != nil {
log.Println(color.RedString(err.Error()))
return middlewares.Responder(c, http.StatusInternalServerError, http.StatusText(http.StatusInternalServerError))
}

return middlewares.Responder(c, http.StatusOK, http.StatusText(http.StatusOK))
}

// EditThumbnail godoc
//
// @Summary Edit Thumbnail
// @Description Edits the thumbnail of a podcast
// @Tags Podcast
// @Accept multipart/form-data
// @Produce json
// @Param episodeNo formData uint true "Enter episode number"
//
// @Param type formData models.PodcastType true "Choose a type"
//
// @Param image formData file true "Upload Thumbnail"
// @Success 200 {object} string
// @Failure 400 {object} models.Error
//
// @Security ApiKeyAuth
// @Router /v1/podcast/edit/thumbnail [put]
func (pc *podcastController) EditThumbnail(c echo.Context) error {
request := new(models.PodcastRequest)
if err := c.Bind(request); err != nil {
log.Println(color.RedString(err.Error()))
return middlewares.Responder(c, http.StatusBadRequest, http.StatusText(http.StatusBadRequest))
}

file, err := c.FormFile("image")
if err != nil {
log.Println(color.RedString(err.Error()))
return err
}

err = pc.ps.EditThumbnail(*request, file)
if err != nil {
log.Println(color.RedString(err.Error()))
return middlewares.Responder(c, http.StatusInternalServerError, http.StatusText(http.StatusInternalServerError))
}

return middlewares.Responder(c, http.StatusOK, http.StatusText(http.StatusOK))
}

// EditURL godoc
//
// @Summary Edit URL
// @Description Edits the media url of a podcast
// @Tags Podcast
// @Accept multipart/form-data
// @Produce json
// @Param episodeNo formData uint true "Enter episode number"
//
// @Param type formData models.PodcastType true "Choose a type"
//
// @Param mediaURL formData string true "Enter Media URL"
// @Success 200 {object} string
// @Failure 400 {object} models.Error
//
// @Security ApiKeyAuth
// @Router /v1/podcast/edit/url [put]
func (pc *podcastController) EditURL(c echo.Context) error {
request := new(models.PodcastRequest)
if err := c.Bind(request); err != nil {
log.Println(color.RedString(err.Error()))
return middlewares.Responder(c, http.StatusBadRequest, http.StatusText(http.StatusBadRequest))
}

err := pc.ps.EditURL(*request)
if err != nil {
log.Println(color.RedString(err.Error()))
return middlewares.Responder(c, http.StatusInternalServerError, http.StatusText(http.StatusInternalServerError))
}

return middlewares.Responder(c, http.StatusOK, http.StatusText(http.StatusOK))
}

// EditDescription godoc
//
// @Summary Edit Description
// @Description Edits the description of a podcast
// @Tags Podcast
// @Accept multipart/form-data
// @Produce json
// @Param episodeNo formData uint true "Enter episode number"
//
// @Param type formData models.PodcastType true "Choose a type"
//
// @Param description formData string true "Enter description"
// @Success 200 {object} string
// @Failure 400 {object} models.Error
//
// @Security ApiKeyAuth
// @Router /v1/podcast/edit/description [put]
func (pc *podcastController) EditDescription(c echo.Context) error {
request := new(models.PodcastRequest)
if err := c.Bind(request); err != nil {
log.Println(color.RedString(err.Error()))
return middlewares.Responder(c, http.StatusBadRequest, http.StatusText(http.StatusBadRequest))
}

err := pc.ps.EditDescription(*request)
if err != nil {
log.Println(color.RedString(err.Error()))
return middlewares.Responder(c, http.StatusInternalServerError, http.StatusText(http.StatusInternalServerError))
}

return middlewares.Responder(c, http.StatusOK, http.StatusText(http.StatusOK))
}

// DeletePodcast godoc
//
// @Summary Delete Podcast
// @Description Deletes a podcast
// @Tags Podcast
// @Accept multipart/form-data
// @Produce json
// @Param episodeNo formData uint true "Enter episode number"
//
// @Param type formData models.PodcastType true "Choose a type"
//
// @Success 200 {object} string
// @Failure 400 {object} models.Error
//
// @Security ApiKeyAuth
// @Router /v1/podcast/delete [delete]
func (pc *podcastController) DeletePodcast(c echo.Context) error {
request := new(models.PodcastRequest)

if err := c.Bind(request); err != nil {
log.Println(color.RedString(err.Error()))
return middlewares.Responder(c, http.StatusBadRequest, http.StatusText(http.StatusBadRequest))
}

err := pc.ps.DeletePodcast(*request)

if err != nil {
log.Println(color.RedString(err.Error()))
return middlewares.Responder(c, http.StatusInternalServerError, http.StatusText(http.StatusInternalServerError))
}

return middlewares.Responder(c, http.StatusOK, http.StatusText(http.StatusOK))
}

// GetPodcastByEpisodeNumberAndType godoc
// @Summary Get Podcast By Episode Number And Type
// @Description Gets a podcast by episode number and type
// @Tags Podcast
// @Accept json
// @Produce json
// @Param episodeNo path uint true "Enter episode number"
// @Param type path models.PodcastType true "Choose a type"
// @Success 200 {object} models.Podcasts
// @Failure 400 {object} models.Error
// @Failure 500 {object} models.Error
// @Router /v1/podcast/get/{episodeNo}/{type} [get]
func (pc *podcastController) GetPodcast(c echo.Context) error {
podcastType, err := utils.PodcastTypeValidator(c.Param("type"))
if err != nil {
return middlewares.Responder(c, http.StatusBadRequest, http.StatusText(http.StatusBadRequest))
}

episodeNo, err := strconv.ParseUint(c.Param("episodeNo"), 10, 64)
if err != nil {
return middlewares.Responder(c, http.StatusBadRequest, http.StatusText(http.StatusBadRequest))
}

podcast, err := pc.ps.GetPodcastByEpisodeNumberAndType(uint(episodeNo), podcastType)
if err != nil {
log.Println(color.RedString(err.Error()))
return middlewares.Responder(c, http.StatusInternalServerError, http.StatusText(http.StatusInternalServerError))
}

return middlewares.Responder(c, http.StatusOK, podcast)
}

// GetAllPodcasts godoc
// @Summary Get All Podcasts
// @Description Gets all podcasts
// @Tags Podcast
// @Accept json
// @Produce json
// @Success 200 {object} []models.Podcasts
// @Failure 400 {object} models.Error
// @Failure 500 {object} models.Error
// @Router /v1/podcast/get/all [get]
func (pc *podcastController) GetAllPodcasts(c echo.Context) error {
podcasts, err := pc.ps.GetAllPodcasts()
if err != nil {
log.Println(color.RedString(err.Error()))
return middlewares.Responder(c, http.StatusInternalServerError, http.StatusText(http.StatusInternalServerError))
}

return middlewares.Responder(c, http.StatusOK, podcasts)
}

// GetPodcastByType godoc
// @Summary Get Podcast By Type
// @Description Gets a podcast by type
// @Tags Podcast
// @Accept json
// @Produce json
// @Param type path models.PodcastType true "Enter type"
// @Success 200 {object} []models.Podcasts
// @Failure 400 {object} models.Error
// @Failure 500 {object} models.Error
// @Router /v1/podcast/getall/{type} [get]
func (pc *podcastController) GetPodcastByType(c echo.Context) error {
podcastType, err := utils.PodcastTypeValidator(c.Param("type"))
if err != nil {
log.Println(color.RedString(err.Error()))
return middlewares.Responder(c, http.StatusBadRequest, http.StatusText(http.StatusBadRequest))
}

podcasts, err := pc.ps.GetPodcastByType(podcastType)
if err != nil {
log.Println(color.RedString(err.Error()))
return middlewares.Responder(c, http.StatusInternalServerError, http.StatusText(http.StatusInternalServerError))
}

return middlewares.Responder(c, http.StatusOK, podcasts)
}
11 changes: 7 additions & 4 deletions docker-compose.yml
Original file line number Diff line number Diff line change
Expand Up @@ -32,7 +32,10 @@ services:
volumes:
- ./database:/data/postgres

networks:
default:
external:
name: thirumathikart_network
adminer:
image: adminer
env_file:
- .env
restart: unless-stopped
ports:
- ${ADMINER_PORT}:${ADMINER_PORT}
Loading