95 lines
1.9 KiB
Go
95 lines
1.9 KiB
Go
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
|
|
}
|