Use ON CONFLICT DO NOTHING for all INSERT queries
This commit is contained in:
parent
77031ef602
commit
31b1769a93
|
@ -3,25 +3,20 @@ package db
|
||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
|
|
||||||
"github.com/lib/pq"
|
|
||||||
|
|
||||||
"gitea.theedgeofrage.com/TheEdgeOfRage/ytrssil-api/models"
|
"gitea.theedgeofrage.com/TheEdgeOfRage/ytrssil-api/models"
|
||||||
)
|
)
|
||||||
|
|
||||||
var createChannelQuery = `INSERT INTO channels (id, name) VALUES ($1, $2)`
|
var createChannelQuery = `INSERT INTO channels (id, name) VALUES ($1, $2) ON CONFLICT DO NOTHING`
|
||||||
|
|
||||||
func (d *postgresDB) CreateChannel(ctx context.Context, channel models.Channel) error {
|
func (d *postgresDB) CreateChannel(ctx context.Context, channel models.Channel) error {
|
||||||
_, err := d.db.ExecContext(ctx, createChannelQuery, channel.ID, channel.Name)
|
resp, err := d.db.ExecContext(ctx, createChannelQuery, channel.ID, channel.Name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if pgerr, ok := err.(*pq.Error); ok {
|
|
||||||
if pgerr.Code == "23505" {
|
|
||||||
return ErrChannelExists
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
d.l.Log("level", "ERROR", "function", "db.CreateChannel", "error", err)
|
d.l.Log("level", "ERROR", "function", "db.CreateChannel", "error", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
if affected, _ := resp.RowsAffected(); affected == 0 {
|
||||||
|
return ErrChannelExists
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
@ -74,19 +69,23 @@ func (d *postgresDB) GetChannelSubscribers(ctx context.Context, channelID string
|
||||||
return subs, nil
|
return subs, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var subscribeUserToChannelQuery = `INSERT INTO user_subscriptions (username, channel_id) VALUES ($1, $2)`
|
var subscribeUserToChannelQuery = `
|
||||||
|
INSERT INTO user_subscriptions (
|
||||||
|
username
|
||||||
|
, channel_id
|
||||||
|
) VALUES ($1, $2)
|
||||||
|
ON CONFLICT DO NOTHING
|
||||||
|
`
|
||||||
|
|
||||||
func (d *postgresDB) SubscribeUserToChannel(ctx context.Context, username string, channelID string) error {
|
func (d *postgresDB) SubscribeUserToChannel(ctx context.Context, username string, channelID string) error {
|
||||||
_, err := d.db.ExecContext(ctx, subscribeUserToChannelQuery, username, channelID)
|
resp, err := d.db.ExecContext(ctx, subscribeUserToChannelQuery, username, channelID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if pgerr, ok := err.(*pq.Error); ok {
|
|
||||||
if pgerr.Code == "23505" {
|
|
||||||
return ErrAlreadySubscribed
|
|
||||||
}
|
|
||||||
}
|
|
||||||
d.l.Log("level", "ERROR", "function", "db.SubscribeUserToChannel", "error", err)
|
d.l.Log("level", "ERROR", "function", "db.SubscribeUserToChannel", "error", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
if affected, _ := resp.RowsAffected(); affected == 0 {
|
||||||
|
return ErrAlreadySubscribed
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
14
db/users.go
14
db/users.go
|
@ -6,7 +6,6 @@ import (
|
||||||
"errors"
|
"errors"
|
||||||
|
|
||||||
"github.com/alexedwards/argon2id"
|
"github.com/alexedwards/argon2id"
|
||||||
"github.com/lib/pq"
|
|
||||||
|
|
||||||
"gitea.theedgeofrage.com/TheEdgeOfRage/ytrssil-api/models"
|
"gitea.theedgeofrage.com/TheEdgeOfRage/ytrssil-api/models"
|
||||||
)
|
)
|
||||||
|
@ -35,20 +34,19 @@ func (d *postgresDB) AuthenticateUser(ctx context.Context, user models.User) (bo
|
||||||
return match, nil
|
return match, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var createUserQuery = `INSERT INTO users (username, password) VALUES ($1, $2)`
|
var createUserQuery = `INSERT INTO users (username, password) VALUES ($1, $2) ON CONFLICT DO NOTHING`
|
||||||
|
|
||||||
func (d *postgresDB) CreateUser(ctx context.Context, user models.User) error {
|
func (d *postgresDB) CreateUser(ctx context.Context, user models.User) error {
|
||||||
_, err := d.db.ExecContext(ctx, createUserQuery, user.Username, user.Password)
|
resp, err := d.db.ExecContext(ctx, createUserQuery, user.Username, user.Password)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if pgerr, ok := err.(*pq.Error); ok {
|
|
||||||
if pgerr.Code == "23505" {
|
|
||||||
return ErrUserExists
|
|
||||||
}
|
|
||||||
}
|
|
||||||
d.l.Log("level", "ERROR", "function", "db.CreateUser", "error", err)
|
d.l.Log("level", "ERROR", "function", "db.CreateUser", "error", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if affected, _ := resp.RowsAffected(); affected == 0 {
|
||||||
|
return ErrUserExists
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
23
db/videos.go
23
db/videos.go
|
@ -5,7 +5,6 @@ import (
|
||||||
"time"
|
"time"
|
||||||
|
|
||||||
"gitea.theedgeofrage.com/TheEdgeOfRage/ytrssil-api/models"
|
"gitea.theedgeofrage.com/TheEdgeOfRage/ytrssil-api/models"
|
||||||
"github.com/lib/pq"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var getNewVideosQuery = `
|
var getNewVideosQuery = `
|
||||||
|
@ -98,24 +97,30 @@ func (d *postgresDB) GetWatchedVideos(ctx context.Context, username string) ([]m
|
||||||
return videos, nil
|
return videos, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var addVideoQuery = `INSERT INTO videos (id, title, published_timestamp, channel_id) VALUES ($1, $2, $3, $4)`
|
var addVideoQuery = `
|
||||||
|
INSERT INTO videos (
|
||||||
|
id
|
||||||
|
, title
|
||||||
|
, published_timestamp
|
||||||
|
, channel_id
|
||||||
|
) VALUES ($1, $2, $3, $4)
|
||||||
|
ON CONFLICT DO NOTHING
|
||||||
|
`
|
||||||
|
|
||||||
func (d *postgresDB) AddVideo(ctx context.Context, video models.Video, channelID string) error {
|
func (d *postgresDB) AddVideo(ctx context.Context, video models.Video, channelID string) error {
|
||||||
_, err := d.db.ExecContext(ctx, addVideoQuery, video.ID, video.Title, video.PublishedTime, channelID)
|
resp, err := d.db.ExecContext(ctx, addVideoQuery, video.ID, video.Title, video.PublishedTime, channelID)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
if pgerr, ok := err.(*pq.Error); ok {
|
|
||||||
if pgerr.Code == "23505" {
|
|
||||||
return ErrVideoExists
|
|
||||||
}
|
|
||||||
}
|
|
||||||
d.l.Log("level", "ERROR", "function", "db.AddVideo", "call", "sql.Exec", "error", err)
|
d.l.Log("level", "ERROR", "function", "db.AddVideo", "call", "sql.Exec", "error", err)
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
if affected, _ := resp.RowsAffected(); affected == 0 {
|
||||||
|
return ErrVideoExists
|
||||||
|
}
|
||||||
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var addVideoToUserQuery = `INSERT INTO user_videos (username, video_id) VALUES ($1, $2)`
|
var addVideoToUserQuery = `INSERT INTO user_videos (username, video_id) VALUES ($1, $2) ON CONFLICT DO NOTHING`
|
||||||
|
|
||||||
func (d *postgresDB) AddVideoToUser(ctx context.Context, username string, videoID string) error {
|
func (d *postgresDB) AddVideoToUser(ctx context.Context, username string, videoID string) error {
|
||||||
_, err := d.db.ExecContext(ctx, addVideoToUserQuery, username, videoID)
|
_, err := d.db.ExecContext(ctx, addVideoToUserQuery, username, videoID)
|
||||||
|
|
Loading…
Reference in New Issue