This commit is contained in:
Salim Amine Bou Aram
2024-10-31 20:32:54 +01:00
parent 5628125ad3
commit ef2768c431
26 changed files with 706 additions and 379 deletions

View File

@@ -3,12 +3,13 @@ package storage
import (
"database/sql"
"fmt"
"strconv"
"strings"
"github.com/google/uuid"
_ "github.com/lib/pq"
"github.com/rs/zerolog/log"
"github.com/spf13/viper"
"strconv"
"strings"
)
type PostgresqlStorage struct {
@@ -19,70 +20,79 @@ type PostgresqlStorage struct {
func NewPostgresqlStorage(cfg *viper.Viper) (PostgresqlStorage, error) {
var (
host = cfg.GetString("storage.db.psql.host")
port = cfg.GetString("storage.db.psql.port")
user = cfg.GetString("storage.db.psql.user")
password = cfg.GetString("storage.db.psql.password")
dbname = cfg.GetString("storage.db.psql.dbname")
sslmode = cfg.GetString("storage.db.psql.sslmode")
pg_schema = cfg.GetString("storage.db.psql.schema")
pgtables_users_firebase = cfg.GetString("storage.db.psql.tables.users_firebase")
host = cfg.GetString("storage.db.psql.host")
port = cfg.GetString("storage.db.psql.port")
user = cfg.GetString("storage.db.psql.user")
password = cfg.GetString("storage.db.psql.password")
dbname = cfg.GetString("storage.db.psql.dbname")
sslMode = cfg.GetString("storage.db.psql.sslMode")
pgSchema = cfg.GetString("storage.db.psql.schema")
pgtablesUsersFirebase = cfg.GetString("storage.db.psql.tables.users_firebase")
)
portInt, _ := strconv.Atoi(port)
psqlconn := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslmode=%s", host, portInt, user, password, dbname, sslmode)
db, err := sql.Open("postgres", psqlconn)
psqlConn := fmt.Sprintf("host=%s port=%d user=%s password=%s dbname=%s sslMode=%s",
host, portInt, user, password, dbname, sslMode)
db, err := sql.Open("postgres", psqlConn)
if err != nil {
log.Error().Err(err).Msg("opening connection to postgresql failed")
return PostgresqlStorage{}, fmt.Errorf("connection to postgresql failed")
}
err = db.Ping()
if err != nil {
if err = db.Ping(); err != nil {
log.Error().Err(err).Msg("ping to postgresql failed")
return PostgresqlStorage{}, fmt.Errorf("connection to postgresql database failed")
}
return PostgresqlStorage{
DbConnection: db,
Schema: pg_schema,
Schema: pgSchema,
Tables: map[string]string{
"users_firebase": fmt.Sprintf("%s.%s", pg_schema, pgtables_users_firebase),
"users_firebase": fmt.Sprintf("%s.%s", pgSchema, pgtablesUsersFirebase),
},
}, nil
}
func (s PostgresqlStorage) CreateFirebaseToken(user_id string, fcm_token string, device_platform string) (err error) {
_, err = uuid.Parse(user_id)
if err != nil {
func (s PostgresqlStorage) CreateFirebaseToken(userId string, fcmToken string, devicePlatform string) (err error) {
if _, err = uuid.Parse(userId); err != nil {
log.Error().Err(err).Msg("Postgresql Storage CreateFirebaseToken invalid User ID")
return err
}
_, err = s.DbConnection.Exec(fmt.Sprintf("INSERT INTO %s (user_id , fcm_token , device_platform) VALUES($1,$2,$3)", s.Tables["users_firebase"]),
user_id,
fcm_token,
device_platform)
if err != nil {
if _, err = s.DbConnection.Exec(fmt.Sprintf("INSERT INTO %s "+
"(user_id , fcm_token , device_platform) VALUES($1,$2,$3)", s.Tables["users_firebase"]),
userId,
fcmToken,
devicePlatform); err != nil {
if strings.Contains(err.Error(), "duplicate key") {
_ = s.UpdateFirebaseToken(user_id, device_platform, fcm_token)
_ = s.UpdateFirebaseToken(userId, devicePlatform, fcmToken)
}
}
return nil
}
func (s PostgresqlStorage) GetFirebaseToken(user_id string) (fcm string, device_platform string, err error) {
err = s.DbConnection.QueryRow(fmt.Sprintf("SELECT fcm_token , device_platform FROM %s WHERE user_id = $1", s.Tables["users_firebase"]), user_id).
func (s PostgresqlStorage) GetFirebaseToken(userId string) (fcm string, devicePlatform string, err error) {
if err = s.DbConnection.QueryRow(fmt.Sprintf("SELECT fcm_token , "+
"device_platform FROM %s WHERE user_id = $1", s.Tables["users_firebase"]), userId).
Scan(
&fcm,
&device_platform,
)
if err != nil {
&devicePlatform,
); err != nil {
return "", "", err
}
return fcm, device_platform, nil
return fcm, devicePlatform, nil
}
func (s PostgresqlStorage) UpdateFirebaseToken(user_id string, fcm_token string, device_platform string) error {
query := fmt.Sprintf("UPDATE %s SET fcm_token = $1 device_platform = $2 WHERE user_id = $3", s.Tables["users_firebase"])
_, err := s.DbConnection.Exec(query, fcm_token, device_platform, user_id)
if err != nil {
func (s PostgresqlStorage) UpdateFirebaseToken(userId string, fcmToken string, devicePlatform string) error {
query := fmt.Sprintf("UPDATE %s SET fcm_token ="+
" $1 device_platform = $2 WHERE user_id = $3", s.Tables["users_firebase"])
if _, err := s.DbConnection.Exec(query, fcmToken, devicePlatform, userId); err != nil {
return err
}
return nil
}

View File

@@ -2,24 +2,25 @@ package storage
import (
"fmt"
"github.com/spf13/viper"
)
type Storage interface {
CreateFirebaseToken(user_id string, fcm_token string, device_platform string) (err error)
UpdateFirebaseToken(user_id string, fcm_token string, device_platform string) error
GetFirebaseToken(user_id string) (fcm string, device_platform string, err error)
CreateFirebaseToken(userId string, fcmToken string, devicePlatform string) (err error)
UpdateFirebaseToken(userId string, fcmToken string, devicePlatform string) error
GetFirebaseToken(userId string) (fcm string, devicePlatform string, err error)
}
func NewStorage(cfg *viper.Viper) (Storage, error) {
var (
storage_type = cfg.GetString("storage.db.type")
storageType = cfg.GetString("storage.db.type")
)
switch storage_type {
switch storageType {
case "psql":
s, err := NewPostgresqlStorage(cfg)
return s, err
default:
return nil, fmt.Errorf("storage type %v is not supported", storage_type)
return nil, fmt.Errorf("storage type %v is not supported", storageType)
}
}