rum-goggles/v1/internal/models/accountchannel.go

95 lines
1.9 KiB
Go
Raw Permalink Normal View History

package models
import (
"database/sql"
"fmt"
)
const (
accountChannelColumns = "a.id, a.uid, a.username, a.cookies, a.profile_image, a.api_key, c.id, c.account_id, c.cid, c.name, c.profile_image, c.api_key"
)
type AccountChannel struct {
Account
Channel
}
type sqlAccountChannel struct {
sqlAccount
sqlChannel
}
func (sac *sqlAccountChannel) scan(r Row) error {
return r.Scan(
&sac.sqlAccount.id,
&sac.sqlAccount.uid,
&sac.sqlAccount.username,
&sac.sqlAccount.cookies,
&sac.sqlAccount.profileImage,
&sac.sqlAccount.apiKey,
&sac.sqlChannel.id,
&sac.sqlChannel.accountID,
&sac.sqlChannel.cid,
&sac.sqlChannel.name,
&sac.sqlChannel.profileImage,
&sac.sqlChannel.apiKey,
)
}
func (sac *sqlAccountChannel) toAccountChannel() *AccountChannel {
var ac AccountChannel
ac.Account = *sac.toAccount()
ac.Channel = *sac.toChannel()
return &ac
}
type AccountChannelService interface {
All() ([]AccountChannel, error)
}
func NewAccountChannelService(db *sql.DB) AccountChannelService {
return &accountChannelService{
Database: db,
}
}
var _ AccountChannelService = &accountChannelService{}
type accountChannelService struct {
Database *sql.DB
}
func (as *accountChannelService) All() ([]AccountChannel, error) {
selectQ := fmt.Sprintf(`
SELECT %s
FROM "%s" a
LEFT JOIN "%s" c ON a.id=c.account_id
`, accountChannelColumns, accountTable, channelTable)
rows, err := as.Database.Query(selectQ)
if err != nil {
return nil, pkgErr("error executing select query", err)
}
defer rows.Close()
accountChannels := []AccountChannel{}
for rows.Next() {
sac := &sqlAccountChannel{}
err = sac.scan(rows)
if err != nil {
return nil, pkgErr("error scanning row", err)
}
accountChannels = append(accountChannels, *sac.toAccountChannel())
}
err = rows.Err()
if err != nil && err != sql.ErrNoRows {
return nil, pkgErr("error iterating over rows", err)
}
return accountChannels, nil
}