added page for all episodes

pull/24/head
Akhil Gupta 4 years ago
parent 1954ed396b
commit 54791a98e2

@ -0,0 +1,182 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/skeleton/2.0.4/skeleton.min.css" integrity="sha512-EZLkOqwILORob+p0BXZc+Vm3RgJBOe1Iq/0fiI7r/wJgzOFZMlsqTa29UEl6v6U6gsV4uIpsNZoV32YZqrCRCQ==" crossorigin="anonymous" />
<title>PodGrab</title>
<style>
.container {
max-width: 800px; }
.header {
margin-top: 6rem;
text-align: center; }
.value-prop {
margin-top: 1rem; }
.value-props {
margin-top: 4rem;
margin-bottom: 4rem; }
.docs-header {
text-transform: uppercase;
font-size: 1.4rem;
letter-spacing: .2rem;
font-weight: 600; }
.docs-section {
border-top: 1px solid #eee;
padding: 4rem 0;
margin-bottom: 0;}
.value-img {
display: block;
text-align: center;
margin: 2.5rem auto 0; }
.example-grid .column,
.example-grid .columns {
background: #EEE;
text-align: center;
border-radius: 4px;
font-size: 1rem;
text-transform: uppercase;
height: 30px;
line-height: 30px;
margin-bottom: .75rem;
font-weight: 600;
letter-spacing: .1rem; }
.docs-example .row,
.docs-example.row,
.docs-example form {
margin-bottom: 0; }
.docs-example h1,
.docs-example h2,
.docs-example h3,
.docs-example h4,
.docs-example h5,
.docs-example h6 {
margin-bottom: 1rem; }
.heading-font-size {
font-size: 1.2rem;
color: #999;
letter-spacing: normal; }
.code-example {
margin-top: 1.5rem;
margin-bottom: 0; }
.code-example-body {
white-space: pre;
word-wrap: break-word }
.example {
position: relative;
margin-top: 4rem; }
.example-header {
font-weight: 600;
margin-top: 1.5rem;
margin-bottom: .5rem; }
.example-description {
margin-bottom: 1.5rem; }
.example-screenshot-wrapper {
display: block;
position: relative;
overflow: hidden;
border-radius: 6px;
border: 1px solid #eee;
height: 250px; }
.example-screenshot {
width: 100%;
height: auto; }
.example-screenshot.coming-soon {
width: auto;
position: absolute;
background: #eee;
top: 5px;
right: 5px;
bottom: 5px;
left: 5px; }
.navbar {
display: none; }
img{
display: none
}
/* Larger than phone */
@media (min-width: 550px) {
.header {
margin-top: 8rem;
}
.value-props {
margin-top: 9rem;
margin-bottom: 7rem; }
.value-img {
margin-bottom: 1rem; }
.example-grid .column,
.example-grid .columns {
margin-bottom: 1.5rem; }
.docs-section {
padding: 6rem 0; }
.example-send-yourself-copy {
float: right;
margin-top: 12px; }
.example-screenshot-wrapper {
position: absolute;
width: 48%;
height: 100%;
left: 0;
max-height: none; }
img{
display: block
}
}
h1,h2,h3,h4,h5{
margin-bottom: 1rem;
}
h4{
font-size: 2rem;
}
h5{
font-size: 1.5rem;
}
p{
margin-bottom: 0.5rem;
}
hr{
margin-top: 1rem;
margin-bottom: 1rem;
}
/* Larger than tablet */
@media (min-width: 750px) {
img{
display: block
}
}
</style>
</head>
<body>
<div class="container">
<section class="header">
<h1>{{ .title }}</h1>
</section>
<br>
{{range .podcastItems}}
<div class="podcasts row">
<div class="columns two">
<img class="u-full-width" src="{{ .Image }}" alt="{{ .Title }}">
</div>
<div class="columns ten">
<h4>{{.Title}} // {{ .Podcast.Title}}</h4>
<small>{{ formatDate .PubDate }}</small>
<p>{{ .Summary }}</p>
<a class="button button-primary" href="{{ .DownloadPath }}" download>Download</a>
</div>
<div class="columns one">
</div>
</div>
<hr>
{{end}}
</div>
</body>
</html>

@ -157,6 +157,11 @@
</div> </div>
<hr> <hr>
{{end}} {{end}}
<div class="row">
<div class="columns twelve" style="text-align: center;">
<a href="/episodes" class="button button-primary">All Episodes</a>
</div>
</div>
</div> </div>
</body> </body>
</html> </html>

@ -19,6 +19,11 @@ type SearchByIdQuery struct {
Id string `binding:"required" uri:"id" json:"id" form:"id"` Id string `binding:"required" uri:"id" json:"id" form:"id"`
} }
type Pagination struct {
Page int `uri:"page" query:"page" json:"page" form:"page"`
Count int `uri:"count" query:"count" json:"count" form:"count"`
}
type AddPodcastData struct { type AddPodcastData struct {
Url string `binding:"required" form:"url" json:"url"` Url string `binding:"required" form:"url" json:"url"`
} }

@ -17,7 +17,11 @@ func GetAllPodcasts(podcasts *[]Podcast) error {
} }
func GetAllPodcastItems(podcasts *[]PodcastItem) error { func GetAllPodcastItems(podcasts *[]PodcastItem) error {
result := DB.Preload("Podcast").Find(&podcasts) result := DB.Preload("Podcast").Order("pub_date desc").Find(&podcasts)
return result.Error
}
func GetPaginatedPodcastItems(page int, count int, podcasts *[]PodcastItem) error {
result := DB.Debug().Preload("Podcast").Limit(count).Offset((page - 1) * count).Order("pub_date desc").Find(&podcasts)
return result.Error return result.Error
} }
func GetPodcastById(id string, podcast *Podcast) error { func GetPodcastById(id string, podcast *Podcast) error {

@ -70,6 +70,28 @@ func main() {
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request"}) c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request"})
} }
})
r.GET("/episodes", func(c *gin.Context) {
var pagination controllers.Pagination
if c.ShouldBindQuery(&pagination) == nil {
var page, count int
if page = pagination.Page; page == 0 {
page = 1
}
if count = pagination.Count; count == 0 {
count = 10
}
var podcastItems []db.PodcastItem
if err := db.GetPaginatedPodcastItems(page, count, &podcastItems); err == nil {
c.HTML(http.StatusOK, "episodes.html", gin.H{"title": "All Episodes", "podcastItems": podcastItems})
} else {
c.JSON(http.StatusBadRequest, err)
}
} else {
c.JSON(http.StatusBadRequest, gin.H{"error": "Invalid request"})
}
}) })
r.POST( r.POST(
"/", func(c *gin.Context) { "/", func(c *gin.Context) {

Loading…
Cancel
Save