qsl designer
This commit is contained in:
+37
-34
@@ -7,6 +7,7 @@
|
||||
// credentials (LoTW / Clublog / QRZ.com) so each callsign can export to
|
||||
// its own account.
|
||||
package profile
|
||||
|
||||
import (
|
||||
"context"
|
||||
"database/sql"
|
||||
@@ -21,28 +22,29 @@ type Profile struct {
|
||||
Name string `json:"name"`
|
||||
Callsign string `json:"callsign"`
|
||||
Operator string `json:"operator"`
|
||||
OpName string `json:"op_name"` // operator's personal name (e.g. "Greg")
|
||||
OwnerCallsign string `json:"owner_callsign"`
|
||||
MyGrid string `json:"my_grid"`
|
||||
MyCountry string `json:"my_country"`
|
||||
MyState string `json:"my_state"`
|
||||
MyCounty string `json:"my_cnty"`
|
||||
MyStreet string `json:"my_street"`
|
||||
MyCity string `json:"my_city"`
|
||||
MyPostalCode string `json:"my_postal_code"`
|
||||
MySOTARef string `json:"my_sota_ref"`
|
||||
MyPOTARef string `json:"my_pota_ref"`
|
||||
MyRig string `json:"my_rig"`
|
||||
MyAntenna string `json:"my_antenna"`
|
||||
MyDXCC *int `json:"my_dxcc,omitempty"`
|
||||
MyCQZone *int `json:"my_cqz,omitempty"`
|
||||
MyITUZone *int `json:"my_ituz,omitempty"`
|
||||
MyLat *float64 `json:"my_lat,omitempty"`
|
||||
MyLon *float64 `json:"my_lon,omitempty"`
|
||||
TxPower *float64 `json:"tx_pwr,omitempty"`
|
||||
IsActive bool `json:"is_active"`
|
||||
SortOrder int `json:"sort_order"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
MyGrid string `json:"my_grid"`
|
||||
MyCountry string `json:"my_country"`
|
||||
MyState string `json:"my_state"`
|
||||
MyCounty string `json:"my_cnty"`
|
||||
MyStreet string `json:"my_street"`
|
||||
MyCity string `json:"my_city"`
|
||||
MyPostalCode string `json:"my_postal_code"`
|
||||
MySOTARef string `json:"my_sota_ref"`
|
||||
MyPOTARef string `json:"my_pota_ref"`
|
||||
MyRig string `json:"my_rig"`
|
||||
MyAntenna string `json:"my_antenna"`
|
||||
MyDXCC *int `json:"my_dxcc,omitempty"`
|
||||
MyCQZone *int `json:"my_cqz,omitempty"`
|
||||
MyITUZone *int `json:"my_ituz,omitempty"`
|
||||
MyLat *float64 `json:"my_lat,omitempty"`
|
||||
MyLon *float64 `json:"my_lon,omitempty"`
|
||||
TxPower *float64 `json:"tx_pwr,omitempty"`
|
||||
IsActive bool `json:"is_active"`
|
||||
SortOrder int `json:"sort_order"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
UpdatedAt time.Time `json:"updated_at"`
|
||||
}
|
||||
|
||||
// Repo is a SQLite-backed profile store. All ops take a context so the
|
||||
@@ -51,7 +53,7 @@ type Repo struct{ db *sql.DB }
|
||||
|
||||
func NewRepo(db *sql.DB) *Repo { return &Repo{db: db} }
|
||||
|
||||
const selectCols = `id, name, callsign, operator, owner_callsign, my_grid, my_country, my_state, my_cnty,
|
||||
const selectCols = `id, name, callsign, operator, op_name, owner_callsign, my_grid, my_country, my_state, my_cnty,
|
||||
my_street, my_city, my_postal_code, my_sota_ref, my_pota_ref,
|
||||
my_rig, my_antenna, my_dxcc, my_cqz, my_ituz, my_lat, my_lon, tx_pwr,
|
||||
is_active, sort_order, created_at, updated_at`
|
||||
@@ -100,12 +102,12 @@ func (r *Repo) Save(ctx context.Context, p *Profile) error {
|
||||
if p.ID == 0 {
|
||||
res, err := r.db.ExecContext(ctx, `
|
||||
INSERT INTO station_profiles
|
||||
(name, callsign, operator, owner_callsign, my_grid, my_country, my_state, my_cnty,
|
||||
(name, callsign, operator, op_name, owner_callsign, my_grid, my_country, my_state, my_cnty,
|
||||
my_street, my_city, my_postal_code, my_sota_ref, my_pota_ref,
|
||||
my_rig, my_antenna, my_dxcc, my_cqz, my_ituz, my_lat, my_lon, tx_pwr,
|
||||
is_active, sort_order, created_at, updated_at)
|
||||
VALUES(?,?,?,?,?,?,?,?, ?,?,?,?,?, ?,?,?,?,?,?,?,?, ?,?,?,?)`,
|
||||
p.Name, p.Callsign, p.Operator, p.OwnerCallsign, p.MyGrid, p.MyCountry, p.MyState, p.MyCounty,
|
||||
VALUES(?,?,?,?,?,?,?,?,?, ?,?,?,?,?, ?,?,?,?,?,?,?,?, ?,?,?,?)`,
|
||||
p.Name, p.Callsign, p.Operator, p.OpName, p.OwnerCallsign, p.MyGrid, p.MyCountry, p.MyState, p.MyCounty,
|
||||
p.MyStreet, p.MyCity, p.MyPostalCode, p.MySOTARef, p.MyPOTARef,
|
||||
p.MyRig, p.MyAntenna, nullableInt(p.MyDXCC), nullableInt(p.MyCQZone), nullableInt(p.MyITUZone),
|
||||
nullableFloat(p.MyLat), nullableFloat(p.MyLon), nullableFloat(p.TxPower),
|
||||
@@ -119,13 +121,13 @@ func (r *Repo) Save(ctx context.Context, p *Profile) error {
|
||||
}
|
||||
_, err := r.db.ExecContext(ctx, `
|
||||
UPDATE station_profiles SET
|
||||
name = ?, callsign = ?, operator = ?, owner_callsign = ?, my_grid = ?, my_country = ?,
|
||||
name = ?, callsign = ?, operator = ?, op_name = ?, owner_callsign = ?, my_grid = ?, my_country = ?,
|
||||
my_state = ?, my_cnty = ?, my_street = ?, my_city = ?, my_postal_code = ?,
|
||||
my_sota_ref = ?, my_pota_ref = ?, my_rig = ?, my_antenna = ?,
|
||||
my_dxcc = ?, my_cqz = ?, my_ituz = ?, my_lat = ?, my_lon = ?, tx_pwr = ?,
|
||||
sort_order = ?, updated_at = ?
|
||||
WHERE id = ?`,
|
||||
p.Name, p.Callsign, p.Operator, p.OwnerCallsign, p.MyGrid, p.MyCountry,
|
||||
p.Name, p.Callsign, p.Operator, p.OpName, p.OwnerCallsign, p.MyGrid, p.MyCountry,
|
||||
p.MyState, p.MyCounty, p.MyStreet, p.MyCity, p.MyPostalCode,
|
||||
p.MySOTARef, p.MyPOTARef, p.MyRig, p.MyAntenna,
|
||||
nullableInt(p.MyDXCC), nullableInt(p.MyCQZone), nullableInt(p.MyITUZone),
|
||||
@@ -219,15 +221,15 @@ type scannable interface {
|
||||
func scan(row scannable) (Profile, error) {
|
||||
var p Profile
|
||||
var (
|
||||
callsign, operator, ownerCall, myGrid, myCountry, myState, myCnty,
|
||||
callsign, operator, opName, ownerCall, myGrid, myCountry, myState, myCnty,
|
||||
myStreet, myCity, myPostal, mySOTA, myPOTA,
|
||||
myRig, myAntenna sql.NullString
|
||||
myDXCC, myCQZ, myITUZ sql.NullInt64
|
||||
myLat, myLon, txPwr sql.NullFloat64
|
||||
isActive, sortOrder int
|
||||
createdAt, updatedAt string
|
||||
myRig, myAntenna sql.NullString
|
||||
myDXCC, myCQZ, myITUZ sql.NullInt64
|
||||
myLat, myLon, txPwr sql.NullFloat64
|
||||
isActive, sortOrder int
|
||||
createdAt, updatedAt string
|
||||
)
|
||||
err := row.Scan(&p.ID, &p.Name, &callsign, &operator, &ownerCall, &myGrid, &myCountry, &myState, &myCnty,
|
||||
err := row.Scan(&p.ID, &p.Name, &callsign, &operator, &opName, &ownerCall, &myGrid, &myCountry, &myState, &myCnty,
|
||||
&myStreet, &myCity, &myPostal, &mySOTA, &myPOTA,
|
||||
&myRig, &myAntenna, &myDXCC, &myCQZ, &myITUZ, &myLat, &myLon, &txPwr,
|
||||
&isActive, &sortOrder, &createdAt, &updatedAt)
|
||||
@@ -236,6 +238,7 @@ func scan(row scannable) (Profile, error) {
|
||||
}
|
||||
p.Callsign = callsign.String
|
||||
p.Operator = operator.String
|
||||
p.OpName = opName.String
|
||||
p.OwnerCallsign = ownerCall.String
|
||||
p.MyGrid = myGrid.String
|
||||
p.MyCountry = myCountry.String
|
||||
|
||||
Reference in New Issue
Block a user