take one on music feature

This commit is contained in:
2022-05-09 19:19:16 -06:00
parent e5bf0c952c
commit 8cc150569b
8 changed files with 142 additions and 9 deletions

View File

@@ -54,6 +54,7 @@ func RegisterAdminGroup(r *gin.RouterGroup) {
r.POST("/login", a.AdminLogin) r.POST("/login", a.AdminLogin)
r.GET("/post", a.AuthMiddleware, utils.ServePage("create_post.tmpl")) r.GET("/post", a.AuthMiddleware, utils.ServePage("create_post.tmpl"))
r.POST("/post", a.AuthMiddleware, a.CRUDPost) r.POST("/post", a.AuthMiddleware, a.CRUDPost)
r.POST("/music", a.AuthMiddleware, a.CreateMusic)
r.POST("/user", a.CreateAdmin) r.POST("/user", a.CreateAdmin)
} }
@@ -150,6 +151,31 @@ func (a *AdminController) CRUDPost(c *gin.Context) {
c.HTML(http.StatusAccepted, "post_success.tmpl", true) c.HTML(http.StatusAccepted, "post_success.tmpl", true)
} }
func (a *AdminController) CreateMusic(c *gin.Context) {
err := c.Request.ParseForm()
if err != nil {
c.HTML(http.StatusNotAcceptable, "post_success.tmpl", false)
return
}
f := c.Request.Form
if f.Get("url") == "" ||
f.Get("name") == "" {
c.HTML(http.StatusNotAcceptable, "post_success.tmpl", false)
return
}
tempMusicRepo := repos.NewMusicRepo("dsn")
tempMusic := &models.Music{
Url: f.Get("url"),
Name: f.Get("name"),
}
err = tempMusicRepo.CreateMusic(tempMusic)
if err != nil {
c.HTML(http.StatusNotAcceptable, "post_success.tmpl", false)
return
}
c.HTML(http.StatusAccepted, "post_success.tmpl", true)
}
func (a *AdminController) CreateAdmin(c *gin.Context) { func (a *AdminController) CreateAdmin(c *gin.Context) {
err := c.Request.ParseForm() err := c.Request.ParseForm()
if err != nil { if err != nil {

View File

@@ -25,10 +25,6 @@ import (
"github.com/rawleyfowler/rawleydotxyz/repos" "github.com/rawleyfowler/rawleydotxyz/repos"
) )
type CommentDto struct {
Url string
}
type BlogController struct { type BlogController struct {
Repository *repos.BlogRepo Repository *repos.BlogRepo
} }

48
controllers/music.go Normal file
View File

@@ -0,0 +1,48 @@
package controllers
/*
Copyright (C) 2022 Rawley Fowler
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <https://www.gnu.org/licenses/>.Rawley Fowler, 2022
*/
import (
"net/http"
"github.com/gin-gonic/gin"
"github.com/rawleyfowler/rawleydotxyz/repos"
)
type MusicController struct {
Repository *repos.MusicRepo
}
func NewMusicController(r *repos.MusicRepo) *MusicController {
c := new(MusicController)
c.Repository = r
return c
}
func RegisterMusicGroup(r *gin.RouterGroup) {
c := NewMusicController(repos.NewMusicRepo("dsn"))
r.GET("/", c.IndexMusicPage)
}
func (mc *MusicController) IndexMusicPage(c *gin.Context) {
music, err := mc.Repository.GetAllSongs()
if err != nil {
c.HTML(http.StatusInternalServerError, "internal_server_error.tmpl", &gin.H{})
return
}
c.HTML(http.StatusOK, "tunes.tmpl", music)
}

View File

@@ -26,8 +26,7 @@ import (
) )
type BlogRepo struct { type BlogRepo struct {
DB *gorm.DB DB *gorm.DB
initialized bool
} }
func NewBlogRepo(dsnPath string) *BlogRepo { func NewBlogRepo(dsnPath string) *BlogRepo {

View File

@@ -18,14 +18,43 @@ along with this program. If not, see <https://www.gnu.org/licenses/>.Rawley Fow
*/ */
import ( import (
"errors"
"gorm.io/gorm" "gorm.io/gorm"
"github.com/rawleyfowler/rawleydotxyz/models"
"github.com/rawleyfowler/rawleydotxyz/utils"
) )
type MusicRepo struct { type MusicRepo struct {
DB *gorm.DB DB *gorm.DB
} }
func (mr *MusicRepo) GetAllSongs() []Music { func NewMusicRepo(dsnPath string) *MusicRepo {
songs := []Music{} mr := new(MusicRepo)
mr.DB.Select() var err error
mr.DB, err = utils.CreateDatabase(utils.LoadDSN(dsnPath))
if err != nil {
panic(err)
}
return mr
}
func (mr *MusicRepo) GetAllSongs() (*[]models.Music, error) {
songs := new([]models.Music)
err := mr.DB.Table("music").Order("name desc").Scan(songs).Error
if err != nil {
return nil, errors.New("Could not load music from database")
}
return songs, nil
}
func (mr *MusicRepo) CreateMusic(m *models.Music) error {
if m.Name == "" || m.Url == "" {
return errors.New("Cannot add music with empty or partially filled values")
}
if err := mr.DB.Table("music").Save(m).Error; err != nil {
return err
}
return nil
} }

View File

@@ -189,6 +189,25 @@ code {
overflow: auto; overflow: auto;
} }
/* For the music page */
.music-container {
display: flex;
flex-direction: row;
flex-wrap: wrap;
}
.music {
display: block;
}
.music::before {
content: "`";
}
.music::after {
content: "`";
}
@media (prefers-color-scheme: dark) { @media (prefers-color-scheme: dark) {
body { body {
color: #f8f8f2; color: #f8f8f2;

View File

@@ -22,5 +22,10 @@
<button type="submit">Make post</button> <button type="submit">Make post</button>
<button type="clear">Clear form</button> <button type="clear">Clear form</button>
</form> </form>
<form action="/admin/music" method="POST">
<input required type="text" placeholder="url" name="url"/>
<input required type="text" placeholder="name" name="name"/>
<button type="submit">Add Band</button>
</form>
</body> </body>
</html> </html>

11
templates/tunes.tmpl Normal file
View File

@@ -0,0 +1,11 @@
<!--music.tmpl-->
{{ template "header.tmpl" . }}
<p>
This serves as a compilation of every band that I like. Genres may vary, however I mostly listen to Hardcore, various genres of Metal, and Ska.
</p>
<div class="music-container">
{{ $val := range . }}
<a href="{{ $val.Url }}" class="music">{{ $val.Name }}</a>
{{ end }}
</div>
{{ template "footer_no_banners.tmpl" . }}