first drafts for inventory sync page

This commit is contained in:
2026-01-09 18:03:54 -07:00
parent 846f56e50b
commit a7c8fe4d64
40 changed files with 1310 additions and 121 deletions
+119 -35
View File
@@ -1,5 +1,8 @@
package accounts
// to generate StoreWithContext
//go:generate concurry -s Store
import (
"context"
"errors"
@@ -15,20 +18,51 @@ type (
db *pgxpool.Pool
}
StoreWithContext struct {
ctx context.Context
db *Store
}
Account struct {
UserID string
ID int64
Email string
AccountIDs
OAuthUser
Email string
}
OAuthUser struct {
UserID string
}
AccountShop struct {
AccountShopIDs
Platform Platform
Name string
}
Listing struct {
AccountIDs
Platform Platform
ShopID string
ListingID int64
SKU string
Name string
Description string
Count int64
}
// ids
AccountIDs struct {
AccountID int64
}
AccountShopIDs struct {
AccountIDs
ShopID string
}
Platform string
)
const (
Etsy Platform = "Etsy"
Tiktok Platform = "Tiktok"
Wix Platform = "Wix"
)
func NewStore(db *pgxpool.Pool) *Store {
@@ -38,10 +72,7 @@ func NewStore(db *pgxpool.Pool) *Store {
}
func (db *Store) WithContext(ctx context.Context) *StoreWithContext {
return &StoreWithContext{
ctx: ctx,
db: db,
}
return NewStoreWithContext(ctx, db)
}
func (db *Store) CreateAccount(ctx context.Context, userID, email string) (Account, error) {
@@ -78,16 +109,20 @@ func (db *Store) CreateAccount(ctx context.Context, userID, email string) (Accou
}
return Account{
UserID: userID,
ID: acctID,
Email: email,
OAuthUser: OAuthUser{
UserID: userID,
},
AccountIDs: AccountIDs{
AccountID: acctID,
},
Email: email,
}, nil
}
func (db *Store) GetAccount(ctx context.Context, id int64) (Account, error) {
rows, err := db.db.Query(
ctx,
"SELECT email FROM accounts WHERE account_id = @account_id",
"SELECT email, user_id FROM accounts WHERE account_id = @account_id",
pgx.NamedArgs{
"account_id": id,
},
@@ -96,7 +131,12 @@ func (db *Store) GetAccount(ctx context.Context, id int64) (Account, error) {
return Account{}, fmt.Errorf("failed to perform query: %w", err)
}
email, err := pgx.CollectExactlyOneRow(rows, pgx.RowTo[string])
type Row struct {
Email string
User_id string
}
r, err := pgx.CollectExactlyOneRow(rows, pgx.RowToStructByNameLax[Row])
if err != nil {
if errors.Is(err, pgx.ErrNoRows) {
return Account{}, consts.ErrNotFound
@@ -106,8 +146,13 @@ func (db *Store) GetAccount(ctx context.Context, id int64) (Account, error) {
}
return Account{
ID: id,
Email: email,
AccountIDs: AccountIDs{
AccountID: id,
},
OAuthUser: OAuthUser{
r.User_id,
},
Email: r.Email,
}, nil
}
@@ -143,16 +188,20 @@ func (db *Store) GetAccountByUserID(ctx context.Context, userID string) (Account
}
return Account{
UserID: userID,
ID: r.Account_ID,
Email: r.Email,
AccountIDs: AccountIDs{
AccountID: r.Account_ID,
},
OAuthUser: OAuthUser{
UserID: userID,
},
Email: r.Email,
}, nil
}
func (db *Store) GetAccountByEmail(ctx context.Context, email string) (Account, error) {
rows, err := db.db.Query(
ctx,
"SELECT account_id FROM accounts WHERE email = @email",
"SELECT account_id, user_id FROM accounts WHERE email = @email",
pgx.NamedArgs{
"email": email,
},
@@ -161,7 +210,12 @@ func (db *Store) GetAccountByEmail(ctx context.Context, email string) (Account,
return Account{}, fmt.Errorf("failed to perform query: %w", err)
}
id, err := pgx.CollectExactlyOneRow(rows, pgx.RowTo[int64])
type Row struct {
Account_id int64
User_id string
}
r, err := pgx.CollectExactlyOneRow(rows, pgx.RowToStructByNameLax[Row])
if err != nil {
if errors.Is(err, pgx.ErrNoRows) {
return Account{}, consts.ErrNotFound
@@ -171,7 +225,12 @@ func (db *Store) GetAccountByEmail(ctx context.Context, email string) (Account,
}
return Account{
ID: id,
AccountIDs: AccountIDs{
AccountID: r.Account_id,
},
OAuthUser: OAuthUser{
UserID: r.User_id,
},
Email: email,
}, nil
}
@@ -213,28 +272,53 @@ func (db *Store) GetUserAndAccountByAccessToken(ctx context.Context, accessToken
return OAuthUser{}, nil, fmt.Errorf("failed to scan row: %w", err)
}
user := OAuthUser{UserID: r.User_ID}
var acct *Account
if r.Account_ID != nil {
acct = &Account{
UserID: r.User_ID,
ID: *r.Account_ID,
Email: *r.Email,
AccountIDs: AccountIDs{
AccountID: *r.Account_ID,
},
OAuthUser: user,
Email: *r.Email,
}
}
return OAuthUser{UserID: r.User_ID}, acct, nil
return user, acct, nil
}
func (db *StoreWithContext) CreateAccount(userID, email string) (Account, error) {
return db.db.CreateAccount(db.ctx, userID, email)
func (db *Store) GetShops(ctx context.Context, acctID int64) ([]AccountShop, error) {
var shops []AccountShop
for _, v := range devShops {
if v.AccountID != acctID {
continue
}
shops = append(shops, v)
}
return shops, nil
}
func (db *StoreWithContext) GetAccount(id int64) (Account, error) {
return db.db.GetAccount(db.ctx, id)
func (db *Store) GetListingsForShop(ctx context.Context, acctID int64, shopID string) ([]Listing, error) {
var vs []Listing
for _, v := range devListings {
if v.AccountID != acctID {
continue
}
if v.ShopID != shopID {
continue
}
vs = append(vs, v)
}
return vs, nil
}
func (db *StoreWithContext) GetAccountPointerByUserID(userID string) (*Account, error) {
acct, err := db.db.GetAccountByUserID(db.ctx, userID)
// additional context
func (db *Store) GetAccountPointerByUserID(ctx context.Context, userID string) (*Account, error) {
acct, err := db.GetAccountByUserID(ctx, userID)
if err == nil {
return &acct, nil
}