added stuff, broke some other stuff, made admin auth!
Signed-off-by: ari melody <ari@arimelody.me>
This commit is contained in:
parent
0d1e694b59
commit
5631c4bd87
26 changed files with 1615 additions and 1401 deletions
210
db.go
210
db.go
|
@ -1,72 +1,61 @@
|
|||
package main
|
||||
|
||||
import (
|
||||
"arimelody.me/arimelody.me/api/v1/music"
|
||||
"arimelody.me/arimelody.me/api/v1/music"
|
||||
|
||||
"fmt"
|
||||
"os"
|
||||
"time"
|
||||
"fmt"
|
||||
"os"
|
||||
"time"
|
||||
|
||||
_ "github.com/lib/pq"
|
||||
"github.com/jmoiron/sqlx"
|
||||
"github.com/jmoiron/sqlx"
|
||||
_ "github.com/lib/pq"
|
||||
)
|
||||
|
||||
var schema =
|
||||
`CREATE TABLE IF NOT EXISTS artists (
|
||||
id TEXT PRIMARY KEY,
|
||||
name TEXT,
|
||||
website TEXT
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS musicreleases (
|
||||
id VARCHAR(64) PRIMARY KEY,
|
||||
title TEXT NOT NULL,
|
||||
type TEXT,
|
||||
release_date DATE NOT NULL,
|
||||
artwork TEXT,
|
||||
buyname TEXT,
|
||||
buylink TEXT
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS musiclinks (
|
||||
release VARCHAR(64) REFERENCES musicreleases(id) ON DELETE CASCADE ON UPDATE CASCADE,
|
||||
name TEXT,
|
||||
url TEXT,
|
||||
CONSTRAINT musiclinks_pk PRIMARY KEY (release, name)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS musiccredits (
|
||||
release VARCHAR(64) REFERENCES musicreleases(ID) ON DELETE CASCADE,
|
||||
artist TEXT REFERENCES artists(id) ON DELETE CASCADE,
|
||||
role TEXT,
|
||||
meta BOOLEAN,
|
||||
constraint musiccredits_pk PRIMARY KEY (release, artist)
|
||||
);
|
||||
|
||||
CREATE TABLE IF NOT EXISTS musictracks (
|
||||
release VARCHAR(64) REFERENCES musicreleases(ID) ON DELETE CASCADE,
|
||||
number INT NOT NULL,
|
||||
title TEXT NOT NULL,
|
||||
description TEXT,
|
||||
lyrics TEXT,
|
||||
preview_url TEXT,
|
||||
CONSTRAINT musictracks_pk PRIMARY KEY (release, number)
|
||||
);`
|
||||
|
||||
func PushArtist(db *sqlx.DB, artist music.Artist) {
|
||||
fmt.Printf("syncing artist [%s] to database...", artist.Name)
|
||||
fmt.Printf("pushing artist [%s] to database...", artist.Name)
|
||||
|
||||
db.MustExec("INSERT INTO artists (id, name, website) VALUES ($1, $2, $3) ON CONFLICT (id) DO UPDATE SET name=$2, website=$3",
|
||||
db.MustExec("INSERT INTO artists (id, name, website) VALUES ($1, $2, $3) ON CONFLICT (id) DO UPDATE SET name=$2, website=$3",
|
||||
&artist.Id,
|
||||
&artist.Name,
|
||||
&artist.Website,
|
||||
)
|
||||
)
|
||||
|
||||
fmt.Printf("done!\n")
|
||||
fmt.Printf("done!\n")
|
||||
}
|
||||
|
||||
func PullAllArtists(db *sqlx.DB) ([]*music.Artist, error) {
|
||||
artists := []*music.Artist{}
|
||||
|
||||
rows, err := db.Query("SELECT id, name, website FROM artists")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for rows.Next() {
|
||||
var artist = music.Artist{}
|
||||
err = rows.Scan(&artist.Id, &artist.Name, &artist.Website)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
artists = append(artists, &artist)
|
||||
}
|
||||
|
||||
return artists, nil
|
||||
}
|
||||
|
||||
func PullArtist(db *sqlx.DB, artistID string) (music.Artist, error) {
|
||||
artist := music.Artist{}
|
||||
|
||||
err := db.Get(&artist, "SELECT id, name, website FROM artists WHERE id=$1", artistID)
|
||||
if err != nil {
|
||||
return music.Artist{}, err
|
||||
}
|
||||
|
||||
return artist, nil
|
||||
}
|
||||
|
||||
func PushRelease(db *sqlx.DB, release music.MusicRelease) {
|
||||
fmt.Printf("syncing release [%s] to database...", release.Id)
|
||||
fmt.Printf("pushing release [%s] to database...", release.Id)
|
||||
|
||||
tx := db.MustBegin()
|
||||
tx.MustExec("INSERT INTO musicreleases (id, title, type, release_date, artwork, buyname, buylink) VALUES ($1, $2, $3, $4, $5, $6, $7) "+
|
||||
|
@ -78,8 +67,8 @@ func PushRelease(db *sqlx.DB, release music.MusicRelease) {
|
|||
&release.Id, &link.Name, &link.Url)
|
||||
}
|
||||
for _, credit := range release.Credits {
|
||||
tx.MustExec("INSERT INTO musiccredits (release, artist, role, meta) VALUES ($1, $2, $3, $4) ON CONFLICT DO NOTHING",
|
||||
&release.Id, &credit.Artist.Id, &credit.Role, &credit.Meta)
|
||||
tx.MustExec("INSERT INTO musiccredits (release, artist, role, is_primary) VALUES ($1, $2, $3, $4) ON CONFLICT DO NOTHING",
|
||||
&release.Id, &credit.Artist.Id, &credit.Role, &credit.Primary)
|
||||
}
|
||||
for _, track := range release.Tracks {
|
||||
tx.MustExec("INSERT INTO musictracks (release, number, title, description, lyrics, preview_url) VALUES ($1, $2, $3, $4, $5, $6) "+
|
||||
|
@ -92,6 +81,114 @@ func PushRelease(db *sqlx.DB, release music.MusicRelease) {
|
|||
fmt.Printf("done!\n")
|
||||
}
|
||||
|
||||
func PullAllReleases(db *sqlx.DB) ([]*music.MusicRelease, error) {
|
||||
releases := []*music.MusicRelease{}
|
||||
|
||||
rows, err := db.Query("SELECT id, title, type, release_date, artwork, buyname, buylink FROM musicreleases")
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
for rows.Next() {
|
||||
var release = music.MusicRelease{}
|
||||
release.Credits = []music.MusicCredit{}
|
||||
release.Links = []music.MusicLink{}
|
||||
release.Tracks = []music.MusicTrack{}
|
||||
|
||||
err = rows.Scan(
|
||||
&release.Id,
|
||||
&release.Title,
|
||||
&release.Type,
|
||||
&release.ReleaseDate,
|
||||
&release.Artwork,
|
||||
&release.Buyname,
|
||||
&release.Buylink)
|
||||
if err != nil {
|
||||
continue
|
||||
}
|
||||
|
||||
// pull musiccredits for artist data
|
||||
credit_rows, err := db.Query("SELECT artist, role, is_primary FROM musiccredits WHERE release=$1", release.Id)
|
||||
if err != nil {
|
||||
fmt.Printf("error pulling credits for %s: %v\n", release.Id, err)
|
||||
continue
|
||||
}
|
||||
for credit_rows.Next() {
|
||||
var artistID string
|
||||
var credit = music.MusicCredit{}
|
||||
err = credit_rows.Scan(
|
||||
&artistID,
|
||||
&credit.Role,
|
||||
&credit.Primary)
|
||||
if err != nil {
|
||||
fmt.Printf("error pulling credit for %s: %v\n", release.Id, err)
|
||||
continue
|
||||
}
|
||||
artist, err := music.GetArtist(artistID)
|
||||
if err != nil {
|
||||
fmt.Printf("error pulling credit for %s: %v\n", release.Id, err)
|
||||
continue
|
||||
}
|
||||
credit.Artist = artist
|
||||
release.Credits = append(release.Credits, credit)
|
||||
}
|
||||
|
||||
// pull musiclinks for link data
|
||||
link_rows, err := db.Query("SELECT name, url FROM musiclinks WHERE release=$1", release.Id);
|
||||
if err != nil {
|
||||
fmt.Printf("error pulling links for %s: %v\n", release.Id, err)
|
||||
continue
|
||||
}
|
||||
for link_rows.Next() {
|
||||
var link = music.MusicLink{}
|
||||
err = link_rows.Scan(
|
||||
&link.Name,
|
||||
&link.Url)
|
||||
if err != nil {
|
||||
fmt.Printf("error pulling link for %s: %v\n", release.Id, err)
|
||||
continue
|
||||
}
|
||||
release.Links = append(release.Links, link)
|
||||
}
|
||||
|
||||
// pull musictracks for track data
|
||||
track_rows, err := db.Query("SELECT number, title, description, lyrics, preview_url FROM musictracks WHERE release=$1", release.Id);
|
||||
if err != nil {
|
||||
fmt.Printf("error pulling tracks for %s: %v\n", release.Id, err)
|
||||
continue
|
||||
}
|
||||
for track_rows.Next() {
|
||||
var track = music.MusicTrack{}
|
||||
err = track_rows.Scan(
|
||||
&track.Number,
|
||||
&track.Title,
|
||||
&track.Description,
|
||||
&track.Lyrics,
|
||||
&track.PreviewUrl)
|
||||
if err != nil {
|
||||
fmt.Printf("error pulling track for %s: %v\n", release.Id, err)
|
||||
continue
|
||||
}
|
||||
release.Tracks = append(release.Tracks, track)
|
||||
}
|
||||
|
||||
releases = append(releases, &release)
|
||||
}
|
||||
|
||||
return releases, nil
|
||||
}
|
||||
|
||||
func PullRelease(db *sqlx.DB, releaseID string) (music.MusicRelease, error) {
|
||||
release := music.MusicRelease{}
|
||||
|
||||
err := db.Get(&release, "SELECT id, title, type, release_date, artwork, buyname, buylink FROM musicreleases WHERE id=$1", releaseID)
|
||||
if err != nil {
|
||||
return music.MusicRelease{}, err
|
||||
}
|
||||
|
||||
return release, nil
|
||||
}
|
||||
|
||||
func InitDatabase() *sqlx.DB {
|
||||
db, err := sqlx.Connect("postgres", "user=arimelody dbname=arimelody password=fuckingpassword sslmode=disable")
|
||||
if err != nil {
|
||||
|
@ -103,8 +200,5 @@ func InitDatabase() *sqlx.DB {
|
|||
db.SetMaxOpenConns(10)
|
||||
db.SetMaxIdleConns(10)
|
||||
|
||||
db.MustExec(schema)
|
||||
fmt.Printf("database schema synchronised.\n")
|
||||
|
||||
return db
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue