add channel table.
This commit is contained in:
@@ -24,6 +24,7 @@ var flagPassword = flag.String("password", "", "")
|
|||||||
var flagMechanism = flag.String("mechanism", "", "")
|
var flagMechanism = flag.String("mechanism", "", "")
|
||||||
var flagInputFile = flag.String("infile", "dump.zip", "The file to read from.")
|
var flagInputFile = flag.String("infile", "dump.zip", "The file to read from.")
|
||||||
var flagIncludeKeys = flag.Bool("include-keys", false, "Whether to include the keys.")
|
var flagIncludeKeys = flag.Bool("include-keys", false, "Whether to include the keys.")
|
||||||
|
var flagReplace = flag.Bool("replace", false, "Replace existing content")
|
||||||
|
|
||||||
func main() {
|
func main() {
|
||||||
flag.Parse()
|
flag.Parse()
|
||||||
@@ -82,6 +83,8 @@ func main() {
|
|||||||
|
|
||||||
hideList := make(map[string]bool)
|
hideList := make(map[string]bool)
|
||||||
|
|
||||||
|
log.Println("Loaded", parts[1], parts[2], "from archive.")
|
||||||
|
|
||||||
switch parts[1] {
|
switch parts[1] {
|
||||||
case "character":
|
case "character":
|
||||||
{
|
{
|
||||||
@@ -91,6 +94,10 @@ func main() {
|
|||||||
log.Fatalln("Could not parse character:", parts[2], err)
|
log.Fatalln("Could not parse character:", parts[2], err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if *flagReplace {
|
||||||
|
_ = db.Characters().Delete(ctx, character)
|
||||||
|
}
|
||||||
|
|
||||||
_, err = db.Characters().Insert(ctx, character)
|
_, err = db.Characters().Insert(ctx, character)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalln("Could not insert character:", parts[2], err)
|
log.Fatalln("Could not insert character:", parts[2], err)
|
||||||
@@ -106,6 +113,10 @@ func main() {
|
|||||||
log.Fatalln("Could not parse channel:", parts[2], err)
|
log.Fatalln("Could not parse channel:", parts[2], err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if *flagReplace {
|
||||||
|
_ = db.Channels().Remove(ctx, channel)
|
||||||
|
}
|
||||||
|
|
||||||
_, err = db.Channels().Insert(ctx, channel)
|
_, err = db.Channels().Insert(ctx, channel)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalln("Could not insert channel:", parts[2], err)
|
log.Fatalln("Could not insert channel:", parts[2], err)
|
||||||
@@ -121,6 +132,10 @@ func main() {
|
|||||||
log.Fatalln("Could not parse character:", parts[2], err)
|
log.Fatalln("Could not parse character:", parts[2], err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if *flagReplace {
|
||||||
|
_ = db.Changes().Remove(ctx, change)
|
||||||
|
}
|
||||||
|
|
||||||
_, err = db.Changes().Insert(ctx, change)
|
_, err = db.Changes().Insert(ctx, change)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
log.Fatalln("Could not insert character:", parts[2], err)
|
log.Fatalln("Could not insert character:", parts[2], err)
|
||||||
|
|||||||
@@ -0,0 +1,100 @@
|
|||||||
|
package postgres
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
"database/sql"
|
||||||
|
"git.aiterp.net/rpdata/api/database/postgres/psqlcore"
|
||||||
|
"git.aiterp.net/rpdata/api/models"
|
||||||
|
)
|
||||||
|
|
||||||
|
type channelRepository struct {
|
||||||
|
insertWithIDs bool
|
||||||
|
db *sql.DB
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *channelRepository) Find(ctx context.Context, name string) (*models.Channel, error) {
|
||||||
|
row, err := psqlcore.New(r.db).SelectChannelByName(ctx, name)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return r.channel(row), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *channelRepository) List(ctx context.Context, filter models.ChannelFilter) ([]*models.Channel, error) {
|
||||||
|
params := psqlcore.SelectChannelsParams{
|
||||||
|
LimitSize: 1000,
|
||||||
|
}
|
||||||
|
|
||||||
|
if filter.Names != nil {
|
||||||
|
params.FilterName = true
|
||||||
|
params.Names = filter.Names
|
||||||
|
}
|
||||||
|
if filter.LocationName != nil {
|
||||||
|
params.FilterLocationName = true
|
||||||
|
params.LocationName = *filter.LocationName
|
||||||
|
}
|
||||||
|
if filter.EventName != nil {
|
||||||
|
params.FilterEventName = true
|
||||||
|
params.EventName = *filter.EventName
|
||||||
|
}
|
||||||
|
if filter.Limit > 0 {
|
||||||
|
params.LimitSize = int32(filter.Limit)
|
||||||
|
}
|
||||||
|
|
||||||
|
rows, err := psqlcore.New(r.db).SelectChannels(ctx, params)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return r.channels(rows), nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *channelRepository) Insert(ctx context.Context, channel models.Channel) (*models.Channel, error) {
|
||||||
|
err := psqlcore.New(r.db).InsertChannel(ctx, psqlcore.InsertChannelParams(channel))
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &channel, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *channelRepository) Update(ctx context.Context, channel models.Channel, update models.ChannelUpdate) (*models.Channel, error) {
|
||||||
|
channel.ApplyUpdate(update)
|
||||||
|
|
||||||
|
err := psqlcore.New(r.db).UpdateChannel(ctx, psqlcore.UpdateChannelParams{
|
||||||
|
Name: channel.Name,
|
||||||
|
Logged: channel.Logged,
|
||||||
|
Hub: channel.Hub,
|
||||||
|
EventName: channel.EventName,
|
||||||
|
LocationName: channel.LocationName,
|
||||||
|
})
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return &channel, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *channelRepository) Remove(ctx context.Context, channel models.Channel) error {
|
||||||
|
return psqlcore.New(r.db).DeleteChannel(ctx, channel.Name)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *channelRepository) channel(row psqlcore.DataChannel) *models.Channel {
|
||||||
|
return &models.Channel{
|
||||||
|
Name: row.Name,
|
||||||
|
Logged: row.Logged,
|
||||||
|
Hub: row.Hub,
|
||||||
|
EventName: row.EventName,
|
||||||
|
LocationName: row.LocationName,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *channelRepository) channels(rows []psqlcore.DataChannel) []*models.Channel {
|
||||||
|
results := make([]*models.Channel, 0, len(rows))
|
||||||
|
for _, row := range rows {
|
||||||
|
results = append(results, r.channel(row))
|
||||||
|
}
|
||||||
|
|
||||||
|
return results
|
||||||
|
}
|
||||||
@@ -51,7 +51,7 @@ func (d *DB) Changes() repositories.ChangeRepository {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (d *DB) Channels() repositories.ChannelRepository {
|
func (d *DB) Channels() repositories.ChannelRepository {
|
||||||
panic("implement me")
|
return &channelRepository{insertWithIDs: d.insertWithIDs, db: d.db}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *DB) Characters() repositories.CharacterRepository {
|
func (d *DB) Characters() repositories.CharacterRepository {
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
-- +goose Up
|
||||||
|
-- +goose StatementBegin
|
||||||
|
CREATE TABLE data_channel (
|
||||||
|
name TEXT NOT NULL PRIMARY KEY,
|
||||||
|
logged BOOLEAN NOT NULL,
|
||||||
|
hub BOOLEAN NOT NULL,
|
||||||
|
event_name TEXT NOT NULL,
|
||||||
|
location_name TEXT NOT NULL
|
||||||
|
);
|
||||||
|
-- +goose StatementEnd
|
||||||
|
|
||||||
|
-- +goose Down
|
||||||
|
-- +goose StatementBegin
|
||||||
|
DROP TABLE IF EXISTS data_channel;
|
||||||
|
-- +goose StatementEnd
|
||||||
@@ -0,0 +1,152 @@
|
|||||||
|
// Code generated by sqlc. DO NOT EDIT.
|
||||||
|
// source: channels.sql
|
||||||
|
|
||||||
|
package psqlcore
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/lib/pq"
|
||||||
|
)
|
||||||
|
|
||||||
|
const deleteChannel = `-- name: DeleteChannel :exec
|
||||||
|
DELETE FROM data_channel WHERE name=$1
|
||||||
|
`
|
||||||
|
|
||||||
|
func (q *Queries) DeleteChannel(ctx context.Context, name string) error {
|
||||||
|
_, err := q.db.ExecContext(ctx, deleteChannel, name)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
const insertChannel = `-- name: InsertChannel :exec
|
||||||
|
INSERT INTO data_channel (name, logged, hub, event_name, location_name)
|
||||||
|
VALUES (
|
||||||
|
$1::text,
|
||||||
|
$2::boolean, $3::boolean,
|
||||||
|
$4::text, $5::text
|
||||||
|
)
|
||||||
|
`
|
||||||
|
|
||||||
|
type InsertChannelParams struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Logged bool `json:"logged"`
|
||||||
|
Hub bool `json:"hub"`
|
||||||
|
EventName string `json:"event_name"`
|
||||||
|
LocationName string `json:"location_name"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (q *Queries) InsertChannel(ctx context.Context, arg InsertChannelParams) error {
|
||||||
|
_, err := q.db.ExecContext(ctx, insertChannel,
|
||||||
|
arg.Name,
|
||||||
|
arg.Logged,
|
||||||
|
arg.Hub,
|
||||||
|
arg.EventName,
|
||||||
|
arg.LocationName,
|
||||||
|
)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
const selectChannelByName = `-- name: SelectChannelByName :one
|
||||||
|
SELECT name, logged, hub, event_name, location_name FROM data_channel WHERE name = $1 LIMIT 1
|
||||||
|
`
|
||||||
|
|
||||||
|
func (q *Queries) SelectChannelByName(ctx context.Context, name string) (DataChannel, error) {
|
||||||
|
row := q.db.QueryRowContext(ctx, selectChannelByName, name)
|
||||||
|
var i DataChannel
|
||||||
|
err := row.Scan(
|
||||||
|
&i.Name,
|
||||||
|
&i.Logged,
|
||||||
|
&i.Hub,
|
||||||
|
&i.EventName,
|
||||||
|
&i.LocationName,
|
||||||
|
)
|
||||||
|
return i, err
|
||||||
|
}
|
||||||
|
|
||||||
|
const selectChannels = `-- name: SelectChannels :many
|
||||||
|
SELECT name, logged, hub, event_name, location_name FROM data_channel
|
||||||
|
WHERE ($1::bool = false OR name = ANY($2::text[]))
|
||||||
|
AND ($3::bool = false OR logged = $4)
|
||||||
|
AND ($5::bool = false OR event_name = $6)
|
||||||
|
AND ($7::bool = false OR location_name = $8)
|
||||||
|
LIMIT $9::int
|
||||||
|
`
|
||||||
|
|
||||||
|
type SelectChannelsParams struct {
|
||||||
|
FilterName bool `json:"filter_name"`
|
||||||
|
Names []string `json:"names"`
|
||||||
|
FilterLogged bool `json:"filter_logged"`
|
||||||
|
Logged bool `json:"logged"`
|
||||||
|
FilterEventName bool `json:"filter_event_name"`
|
||||||
|
EventName string `json:"event_name"`
|
||||||
|
FilterLocationName bool `json:"filter_location_name"`
|
||||||
|
LocationName string `json:"location_name"`
|
||||||
|
LimitSize int32 `json:"limit_size"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (q *Queries) SelectChannels(ctx context.Context, arg SelectChannelsParams) ([]DataChannel, error) {
|
||||||
|
rows, err := q.db.QueryContext(ctx, selectChannels,
|
||||||
|
arg.FilterName,
|
||||||
|
pq.Array(arg.Names),
|
||||||
|
arg.FilterLogged,
|
||||||
|
arg.Logged,
|
||||||
|
arg.FilterEventName,
|
||||||
|
arg.EventName,
|
||||||
|
arg.FilterLocationName,
|
||||||
|
arg.LocationName,
|
||||||
|
arg.LimitSize,
|
||||||
|
)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer rows.Close()
|
||||||
|
items := []DataChannel{}
|
||||||
|
for rows.Next() {
|
||||||
|
var i DataChannel
|
||||||
|
if err := rows.Scan(
|
||||||
|
&i.Name,
|
||||||
|
&i.Logged,
|
||||||
|
&i.Hub,
|
||||||
|
&i.EventName,
|
||||||
|
&i.LocationName,
|
||||||
|
); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
items = append(items, i)
|
||||||
|
}
|
||||||
|
if err := rows.Close(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err := rows.Err(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return items, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
const updateChannel = `-- name: UpdateChannel :exec
|
||||||
|
UPDATE data_channel
|
||||||
|
SET logged=$1::boolean,
|
||||||
|
hub=$2::boolean,
|
||||||
|
event_name=$3::text,
|
||||||
|
location_name=$4::text
|
||||||
|
WHERE name=$5::text
|
||||||
|
`
|
||||||
|
|
||||||
|
type UpdateChannelParams struct {
|
||||||
|
Logged bool `json:"logged"`
|
||||||
|
Hub bool `json:"hub"`
|
||||||
|
EventName string `json:"event_name"`
|
||||||
|
LocationName string `json:"location_name"`
|
||||||
|
Name string `json:"name"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (q *Queries) UpdateChannel(ctx context.Context, arg UpdateChannelParams) error {
|
||||||
|
_, err := q.db.ExecContext(ctx, updateChannel,
|
||||||
|
arg.Logged,
|
||||||
|
arg.Hub,
|
||||||
|
arg.EventName,
|
||||||
|
arg.LocationName,
|
||||||
|
arg.Name,
|
||||||
|
)
|
||||||
|
return err
|
||||||
|
}
|
||||||
@@ -11,6 +11,14 @@ type CoreCounter struct {
|
|||||||
Value sql.NullInt32 `json:"value"`
|
Value sql.NullInt32 `json:"value"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type DataChannel struct {
|
||||||
|
Name string `json:"name"`
|
||||||
|
Logged bool `json:"logged"`
|
||||||
|
Hub bool `json:"hub"`
|
||||||
|
EventName string `json:"event_name"`
|
||||||
|
LocationName string `json:"location_name"`
|
||||||
|
}
|
||||||
|
|
||||||
type DataCharacter struct {
|
type DataCharacter struct {
|
||||||
ID string `json:"id"`
|
ID string `json:"id"`
|
||||||
Nicks []string `json:"nicks"`
|
Nicks []string `json:"nicks"`
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
-- name: SelectChannelByName :one
|
||||||
|
SELECT * FROM data_channel WHERE name = $1 LIMIT 1;
|
||||||
|
|
||||||
|
-- name: InsertChannel :exec
|
||||||
|
INSERT INTO data_channel (name, logged, hub, event_name, location_name)
|
||||||
|
VALUES (
|
||||||
|
sqlc.arg(name)::text,
|
||||||
|
sqlc.arg(logged)::boolean, sqlc.arg(hub)::boolean,
|
||||||
|
sqlc.arg(event_name)::text, sqlc.arg(location_name)::text
|
||||||
|
);
|
||||||
|
|
||||||
|
-- name: SelectChannels :many
|
||||||
|
SELECT * FROM data_channel
|
||||||
|
WHERE (sqlc.arg(filter_name)::bool = false OR name = ANY(sqlc.arg(names)::text[]))
|
||||||
|
AND (sqlc.arg(filter_logged)::bool = false OR logged = sqlc.arg(logged))
|
||||||
|
AND (sqlc.arg(filter_event_name)::bool = false OR event_name = sqlc.arg(event_name))
|
||||||
|
AND (sqlc.arg(filter_location_name)::bool = false OR location_name = sqlc.arg(location_name))
|
||||||
|
LIMIT sqlc.arg(limit_size)::int;
|
||||||
|
|
||||||
|
-- name: UpdateChannel :exec
|
||||||
|
UPDATE data_channel
|
||||||
|
SET logged=sqlc.arg(logged)::boolean,
|
||||||
|
hub=sqlc.arg(hub)::boolean,
|
||||||
|
event_name=sqlc.arg(event_name)::text,
|
||||||
|
location_name=sqlc.arg(location_name)::text
|
||||||
|
WHERE name=sqlc.arg(name)::text;
|
||||||
|
|
||||||
|
-- name: DeleteChannel :exec
|
||||||
|
DELETE FROM data_channel WHERE name=$1;
|
||||||
@@ -9,6 +9,21 @@ type Channel struct {
|
|||||||
LocationName string `bson:"locationName,omitempty"`
|
LocationName string `bson:"locationName,omitempty"`
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (channel *Channel) ApplyUpdate(update ChannelUpdate) {
|
||||||
|
if update.Logged != nil {
|
||||||
|
channel.Logged = *update.Logged
|
||||||
|
}
|
||||||
|
if update.Hub != nil {
|
||||||
|
channel.Hub = *update.Hub
|
||||||
|
}
|
||||||
|
if update.EventName != nil {
|
||||||
|
channel.EventName = *update.EventName
|
||||||
|
}
|
||||||
|
if update.LocationName != nil {
|
||||||
|
channel.LocationName = *update.LocationName
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// IsChangeObject is an interface implementation to identify it as a valid
|
// IsChangeObject is an interface implementation to identify it as a valid
|
||||||
// ChangeObject in GQL.
|
// ChangeObject in GQL.
|
||||||
func (*Channel) IsChangeObject() {
|
func (*Channel) IsChangeObject() {
|
||||||
|
|||||||
Reference in New Issue
Block a user