31b1769a93b3bdc6700f5ddc569d1a75e00976e1

Author
Pavle Portic <git@theedgeofrage.com>
Committer
Pavle Portic <git@theedgeofrage.com>
Date

Message

Use ON CONFLICT DO NOTHING for all INSERT queries

Diff

  1diff --git a/db/channels.go b/db/channels.go
  2index 00cd8f20cbd2891711f900333b4e7015533eddfb..835e9773cf698f35a8b857629eecc3f757e90df9 100644
  3--- a/db/channels.go
  4+++ b/db/channels.go
  5@@ -3,25 +3,20 @@ package db
  6 import (
  7 	"context"
  8 
  9-	"github.com/lib/pq"
 10-
 11 	"gitea.theedgeofrage.com/TheEdgeOfRage/ytrssil-api/models"
 12 )
 13 
 14-var createChannelQuery = `INSERT INTO channels (id, name) VALUES ($1, $2)`
 15+var createChannelQuery = `INSERT INTO channels (id, name) VALUES ($1, $2) ON CONFLICT DO NOTHING`
 16 
 17 func (d *postgresDB) CreateChannel(ctx context.Context, channel models.Channel) error {
 18-	_, err := d.db.ExecContext(ctx, createChannelQuery, channel.ID, channel.Name)
 19+	resp, err := d.db.ExecContext(ctx, createChannelQuery, channel.ID, channel.Name)
 20 	if err != nil {
 21-		if pgerr, ok := err.(*pq.Error); ok {
 22-			if pgerr.Code == "23505" {
 23-				return ErrChannelExists
 24-			}
 25-		}
 26-
 27 		d.l.Log("level", "ERROR", "function", "db.CreateChannel", "error", err)
 28 		return err
 29 	}
 30+	if affected, _ := resp.RowsAffected(); affected == 0 {
 31+		return ErrChannelExists
 32+	}
 33 
 34 	return nil
 35 }
 36@@ -74,19 +69,23 @@ func (d *postgresDB) GetChannelSubscribers(ctx context.Context, channelID string
 37 	return subs, nil
 38 }
 39 
 40-var subscribeUserToChannelQuery = `INSERT INTO user_subscriptions (username, channel_id) VALUES ($1, $2)`
 41+var subscribeUserToChannelQuery = `
 42+INSERT INTO user_subscriptions (
 43+	username
 44+	, channel_id
 45+) VALUES ($1, $2)
 46+ON CONFLICT DO NOTHING
 47+`
 48 
 49 func (d *postgresDB) SubscribeUserToChannel(ctx context.Context, username string, channelID string) error {
 50-	_, err := d.db.ExecContext(ctx, subscribeUserToChannelQuery, username, channelID)
 51+	resp, err := d.db.ExecContext(ctx, subscribeUserToChannelQuery, username, channelID)
 52 	if err != nil {
 53-		if pgerr, ok := err.(*pq.Error); ok {
 54-			if pgerr.Code == "23505" {
 55-				return ErrAlreadySubscribed
 56-			}
 57-		}
 58 		d.l.Log("level", "ERROR", "function", "db.SubscribeUserToChannel", "error", err)
 59 		return err
 60 	}
 61+	if affected, _ := resp.RowsAffected(); affected == 0 {
 62+		return ErrAlreadySubscribed
 63+	}
 64 
 65 	return nil
 66 }
 67diff --git a/db/users.go b/db/users.go
 68index 64bb9f53bda323837b09526c5bd5c1ef904fbdd0..c70cae8c0e174117d19bdd7104d834429f7bb652 100644
 69--- a/db/users.go
 70+++ b/db/users.go
 71@@ -6,7 +6,6 @@ import (
 72 	"errors"
 73 
 74 	"github.com/alexedwards/argon2id"
 75-	"github.com/lib/pq"
 76 
 77 	"gitea.theedgeofrage.com/TheEdgeOfRage/ytrssil-api/models"
 78 )
 79@@ -35,20 +34,19 @@ func (d *postgresDB) AuthenticateUser(ctx context.Context, user models.User) (bo
 80 	return match, nil
 81 }
 82 
 83-var createUserQuery = `INSERT INTO users (username, password) VALUES ($1, $2)`
 84+var createUserQuery = `INSERT INTO users (username, password) VALUES ($1, $2) ON CONFLICT DO NOTHING`
 85 
 86 func (d *postgresDB) CreateUser(ctx context.Context, user models.User) error {
 87-	_, err := d.db.ExecContext(ctx, createUserQuery, user.Username, user.Password)
 88+	resp, err := d.db.ExecContext(ctx, createUserQuery, user.Username, user.Password)
 89 	if err != nil {
 90-		if pgerr, ok := err.(*pq.Error); ok {
 91-			if pgerr.Code == "23505" {
 92-				return ErrUserExists
 93-			}
 94-		}
 95 		d.l.Log("level", "ERROR", "function", "db.CreateUser", "error", err)
 96 		return err
 97 	}
 98 
 99+	if affected, _ := resp.RowsAffected(); affected == 0 {
100+		return ErrUserExists
101+	}
102+
103 	return nil
104 }
105 
106diff --git a/db/videos.go b/db/videos.go
107index 4630f3ba94e82f2db143a275540ee7c97d626344..ee8e82e611c0024ea7e9dffde77c7de1d3207ba2 100644
108--- a/db/videos.go
109+++ b/db/videos.go
110@@ -5,7 +5,6 @@ import (
111 	"time"
112 
113 	"gitea.theedgeofrage.com/TheEdgeOfRage/ytrssil-api/models"
114-	"github.com/lib/pq"
115 )
116 
117 var getNewVideosQuery = `
118@@ -98,24 +97,30 @@ func (d *postgresDB) GetWatchedVideos(ctx context.Context, username string) ([]m
119 	return videos, nil
120 }
121 
122-var addVideoQuery = `INSERT INTO videos (id, title, published_timestamp, channel_id) VALUES ($1, $2, $3, $4)`
123+var addVideoQuery = `
124+INSERT INTO videos (
125+	id
126+	, title
127+	, published_timestamp
128+	, channel_id
129+) VALUES ($1, $2, $3, $4)
130+ON CONFLICT DO NOTHING
131+`
132 
133 func (d *postgresDB) AddVideo(ctx context.Context, video models.Video, channelID string) error {
134-	_, err := d.db.ExecContext(ctx, addVideoQuery, video.ID, video.Title, video.PublishedTime, channelID)
135+	resp, err := d.db.ExecContext(ctx, addVideoQuery, video.ID, video.Title, video.PublishedTime, channelID)
136 	if err != nil {
137-		if pgerr, ok := err.(*pq.Error); ok {
138-			if pgerr.Code == "23505" {
139-				return ErrVideoExists
140-			}
141-		}
142 		d.l.Log("level", "ERROR", "function", "db.AddVideo", "call", "sql.Exec", "error", err)
143 		return err
144 	}
145+	if affected, _ := resp.RowsAffected(); affected == 0 {
146+		return ErrVideoExists
147+	}
148 
149 	return nil
150 }
151 
152-var addVideoToUserQuery = `INSERT INTO user_videos (username, video_id) VALUES ($1, $2)`
153+var addVideoToUserQuery = `INSERT INTO user_videos (username, video_id) VALUES ($1, $2) ON CONFLICT DO NOTHING`
154 
155 func (d *postgresDB) AddVideoToUser(ctx context.Context, username string, videoID string) error {
156 	_, err := d.db.ExecContext(ctx, addVideoToUserQuery, username, videoID)