mirror of
https://github.com/MeshCore-Beacon/beacon-server.git
synced 2026-10-23 06:22:52 +00:00
feat(meshmapper): import zone groups as regions
This commit is contained in:
1 parent
bfda0d5281
commit
a970484b00
22 files changed
+785
-58
No files matched your search
+124
-16
@@ -13,6 +13,22 @@ import (
|
||||
"github.com/jackc/pgx/v5/pgtype"
|
||||
)
|
||||
|
||||
const addRegionIATAs = `-- name: AddRegionIATAs :exec
|
||||
INSERT INTO region_iatas (region_id, iata)
|
||||
SELECT $1, unnest($2::bpchar[])
|
||||
ON CONFLICT (region_id, iata) DO NOTHING
|
||||
`
|
||||
|
||||
type AddRegionIATAsParams struct {
|
||||
RegionID int32 `json:"region_id"`
|
||||
Iatas []string `json:"iatas"`
|
||||
}
|
||||
|
||||
func (q *Queries) AddRegionIATAs(ctx context.Context, arg AddRegionIATAsParams) error {
|
||||
_, err := q.db.Exec(ctx, addRegionIATAs, arg.RegionID, arg.Iatas)
|
||||
return err
|
||||
}
|
||||
|
||||
const ambiguousPrefixes = `-- name: AmbiguousPrefixes :many
|
||||
SELECT iata::text AS iata, 1::int AS len, prefix_1 AS prefix FROM node_short_ids GROUP BY iata, prefix_1 HAVING COUNT(*) > 1
|
||||
UNION ALL
|
||||
@@ -235,6 +251,20 @@ func (q *Queries) DeleteOldTraceIATAs(ctx context.Context, lastHeard pgtype.Time
|
||||
return err
|
||||
}
|
||||
|
||||
const deleteRegionIATAsNotIn = `-- name: DeleteRegionIATAsNotIn :exec
|
||||
DELETE FROM region_iatas WHERE region_id = $1 AND NOT (iata = ANY($2::bpchar[]))
|
||||
`
|
||||
|
||||
type DeleteRegionIATAsNotInParams struct {
|
||||
RegionID int32 `json:"region_id"`
|
||||
Keep []string `json:"keep"`
|
||||
}
|
||||
|
||||
func (q *Queries) DeleteRegionIATAsNotIn(ctx context.Context, arg DeleteRegionIATAsNotInParams) error {
|
||||
_, err := q.db.Exec(ctx, deleteRegionIATAsNotIn, arg.RegionID, arg.Keep)
|
||||
return err
|
||||
}
|
||||
|
||||
const getAccount = `-- name: GetAccount :one
|
||||
SELECT id, name, created_at, deactivated_at FROM accounts WHERE id = $1
|
||||
`
|
||||
@@ -3687,6 +3717,50 @@ func (q *Queries) ListPacketsByIATAs(ctx context.Context, arg ListPacketsByIATAs
|
||||
return items, nil
|
||||
}
|
||||
|
||||
const listRegionState = `-- name: ListRegionState :many
|
||||
SELECT r.slug, r.name, COALESCE(r.display_order, 0)::int AS display_order, r.imported,
|
||||
COALESCE(array_agg(ri.iata::text ORDER BY ri.iata) FILTER (WHERE ri.iata IS NOT NULL), '{}')::text[] AS iatas
|
||||
FROM regions r
|
||||
LEFT JOIN region_iatas ri ON ri.region_id = r.id
|
||||
GROUP BY r.id
|
||||
ORDER BY r.slug
|
||||
`
|
||||
|
||||
type ListRegionStateRow struct {
|
||||
Slug string `json:"slug"`
|
||||
Name string `json:"name"`
|
||||
DisplayOrder int32 `json:"display_order"`
|
||||
Imported bool `json:"imported"`
|
||||
Iatas []string `json:"iatas"`
|
||||
}
|
||||
|
||||
// Every region with its members, for reconciling imported MeshMapper groups.
|
||||
func (q *Queries) ListRegionState(ctx context.Context) ([]ListRegionStateRow, error) {
|
||||
rows, err := q.db.Query(ctx, listRegionState)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
items := []ListRegionStateRow{}
|
||||
for rows.Next() {
|
||||
var i ListRegionStateRow
|
||||
if err := rows.Scan(
|
||||
&i.Slug,
|
||||
&i.Name,
|
||||
&i.DisplayOrder,
|
||||
&i.Imported,
|
||||
&i.Iatas,
|
||||
); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
items = append(items, i)
|
||||
}
|
||||
if err := rows.Err(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return items, nil
|
||||
}
|
||||
|
||||
const listRegions = `-- name: ListRegions :many
|
||||
|
||||
SELECT id, slug, name
|
||||
@@ -3926,6 +4000,30 @@ func (q *Queries) ListZoneBoundaries(ctx context.Context) ([]MeshmapperZoneBound
|
||||
return items, nil
|
||||
}
|
||||
|
||||
const pruneImportedRegions = `-- name: PruneImportedRegions :many
|
||||
DELETE FROM regions WHERE imported AND NOT (slug = ANY($1::text[])) RETURNING slug
|
||||
`
|
||||
|
||||
func (q *Queries) PruneImportedRegions(ctx context.Context, keep []string) ([]string, error) {
|
||||
rows, err := q.db.Query(ctx, pruneImportedRegions, keep)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
items := []string{}
|
||||
for rows.Next() {
|
||||
var slug string
|
||||
if err := rows.Scan(&slug); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
items = append(items, slug)
|
||||
}
|
||||
if err := rows.Err(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return items, nil
|
||||
}
|
||||
|
||||
const pruneZoneBoundaries = `-- name: PruneZoneBoundaries :many
|
||||
DELETE FROM meshmapper_zone_boundaries WHERE NOT (iata = ANY($1::text[])) RETURNING iata
|
||||
`
|
||||
@@ -4941,6 +5039,31 @@ func (q *Queries) UpsertIATADetails(ctx context.Context, arg UpsertIATADetailsPa
|
||||
return err
|
||||
}
|
||||
|
||||
const upsertImportedRegion = `-- name: UpsertImportedRegion :one
|
||||
INSERT INTO regions (slug, name, display_order, zoom_level, imported, updated_at)
|
||||
VALUES ($1, $2, $3, NULL, TRUE, NOW())
|
||||
ON CONFLICT (slug) DO UPDATE SET
|
||||
name = EXCLUDED.name,
|
||||
display_order = EXCLUDED.display_order,
|
||||
updated_at = NOW()
|
||||
WHERE regions.imported
|
||||
RETURNING id
|
||||
`
|
||||
|
||||
type UpsertImportedRegionParams struct {
|
||||
Slug string `json:"slug"`
|
||||
Name string `json:"name"`
|
||||
DisplayOrder *int32 `json:"display_order"`
|
||||
}
|
||||
|
||||
// A hand-written region owns its slug: the WHERE turns a clash into no row.
|
||||
func (q *Queries) UpsertImportedRegion(ctx context.Context, arg UpsertImportedRegionParams) (int32, error) {
|
||||
row := q.db.QueryRow(ctx, upsertImportedRegion, arg.Slug, arg.Name, arg.DisplayOrder)
|
||||
var id int32
|
||||
err := row.Scan(&id)
|
||||
return id, err
|
||||
}
|
||||
|
||||
const upsertKnownRoute = `-- name: UpsertKnownRoute :exec
|
||||
|
||||
INSERT INTO known_routes (path_key, node_ids, hash_prefix, iata, hop_count)
|
||||
@@ -5325,6 +5448,7 @@ ON CONFLICT (slug) DO UPDATE SET
|
||||
center_lat = EXCLUDED.center_lat,
|
||||
center_lng = EXCLUDED.center_lng,
|
||||
zoom_level = EXCLUDED.zoom_level,
|
||||
imported = FALSE, -- config owns the slug from now on
|
||||
updated_at = NOW()
|
||||
RETURNING id
|
||||
`
|
||||
@@ -5354,22 +5478,6 @@ func (q *Queries) UpsertRegion(ctx context.Context, arg UpsertRegionParams) (int
|
||||
return id, err
|
||||
}
|
||||
|
||||
const upsertRegionIATA = `-- name: UpsertRegionIATA :exec
|
||||
INSERT INTO region_iatas (region_id, iata)
|
||||
VALUES ($1, $2)
|
||||
ON CONFLICT (region_id, iata) DO NOTHING
|
||||
`
|
||||
|
||||
type UpsertRegionIATAParams struct {
|
||||
RegionID int32 `json:"region_id"`
|
||||
Iata string `json:"iata"`
|
||||
}
|
||||
|
||||
func (q *Queries) UpsertRegionIATA(ctx context.Context, arg UpsertRegionIATAParams) error {
|
||||
_, err := q.db.Exec(ctx, upsertRegionIATA, arg.RegionID, arg.Iata)
|
||||
return err
|
||||
}
|
||||
|
||||
const upsertTraceIATA = `-- name: UpsertTraceIATA :exec
|
||||
INSERT INTO trace_iatas (trace_tag, iata, last_heard)
|
||||
VALUES ($1, $2, $3)
|
||||
|
||||
Reference in new issue
Block a user