feat: init
This commit is contained in:
parent
7688020b52
commit
6302dd62d6
33 changed files with 6027 additions and 0 deletions
22
internal/repository/helpers.go
Normal file
22
internal/repository/helpers.go
Normal file
|
|
@ -0,0 +1,22 @@
|
|||
package repository
|
||||
|
||||
import (
|
||||
"github.com/google/uuid"
|
||||
"github.com/jackc/pgx/v5/pgtype"
|
||||
)
|
||||
|
||||
func UUIDToPg(in uuid.UUID) pgtype.UUID {
|
||||
if in == uuid.Nil {
|
||||
return pgtype.UUID{}
|
||||
}
|
||||
|
||||
return pgtype.UUID{Bytes: in, Valid: true}
|
||||
}
|
||||
|
||||
func PGToUUID(in pgtype.UUID) uuid.UUID {
|
||||
if !in.Valid {
|
||||
return uuid.Nil
|
||||
}
|
||||
|
||||
return in.Bytes
|
||||
}
|
||||
29
internal/repository/migrations/0001_init.up.sql
Normal file
29
internal/repository/migrations/0001_init.up.sql
Normal file
|
|
@ -0,0 +1,29 @@
|
|||
create table users (
|
||||
id uuid primary key,
|
||||
login text not null
|
||||
);
|
||||
|
||||
create type status as enum ('active', 'offline', 'busy');
|
||||
|
||||
create table stations (
|
||||
id uuid primary key,
|
||||
slug text not null,
|
||||
status status not null
|
||||
);
|
||||
|
||||
create table satellites (
|
||||
id uuid primary key,
|
||||
display_name text not null,
|
||||
status status not null
|
||||
);
|
||||
|
||||
create table subscriptions (
|
||||
id uuid primary key,
|
||||
user_id uuid not null references users(id),
|
||||
station_id uuid null references satellites(id),
|
||||
satellite_id uuid null references stations(id),
|
||||
created_at timestamp not null,
|
||||
updated_at timestamp not null,
|
||||
|
||||
check (station_id is not null or satellite_id is not null)
|
||||
);
|
||||
4
internal/repository/queries/queries.sql
Normal file
4
internal/repository/queries/queries.sql
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
-- name: GetStationByID :one
|
||||
select *
|
||||
from stations
|
||||
where id = @id;
|
||||
26
internal/repository/repository.go
Normal file
26
internal/repository/repository.go
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
package repository
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"git.intra.yksa.space/gsn/gsn-proxy/internal/ds"
|
||||
"git.intra.yksa.space/gsn/gsn-proxy/internal/repository/sqlc"
|
||||
"github.com/google/uuid"
|
||||
)
|
||||
|
||||
type Repository struct {
|
||||
queries *sqlc.Queries
|
||||
}
|
||||
|
||||
func (r *Repository) GetStationByID(ctx context.Context, ID uuid.UUID) (ds.Station, error) {
|
||||
ret, err := r.queries.GetStationByID(ctx, UUIDToPg(ID))
|
||||
if err != nil {
|
||||
return ds.Station{}, err
|
||||
}
|
||||
|
||||
return ds.Station{
|
||||
ID: PGToUUID(ret.ID),
|
||||
Slug: ret.Slug,
|
||||
Status: ds.Status(ret.Status),
|
||||
}, nil
|
||||
}
|
||||
32
internal/repository/sqlc/db.go
Normal file
32
internal/repository/sqlc/db.go
Normal file
|
|
@ -0,0 +1,32 @@
|
|||
// Code generated by sqlc. DO NOT EDIT.
|
||||
// versions:
|
||||
// sqlc v1.28.0
|
||||
|
||||
package sqlc
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/jackc/pgx/v5"
|
||||
"github.com/jackc/pgx/v5/pgconn"
|
||||
)
|
||||
|
||||
type DBTX interface {
|
||||
Exec(context.Context, string, ...interface{}) (pgconn.CommandTag, error)
|
||||
Query(context.Context, string, ...interface{}) (pgx.Rows, error)
|
||||
QueryRow(context.Context, string, ...interface{}) pgx.Row
|
||||
}
|
||||
|
||||
func New(db DBTX) *Queries {
|
||||
return &Queries{db: db}
|
||||
}
|
||||
|
||||
type Queries struct {
|
||||
db DBTX
|
||||
}
|
||||
|
||||
func (q *Queries) WithTx(tx pgx.Tx) *Queries {
|
||||
return &Queries{
|
||||
db: tx,
|
||||
}
|
||||
}
|
||||
81
internal/repository/sqlc/models.go
Normal file
81
internal/repository/sqlc/models.go
Normal file
|
|
@ -0,0 +1,81 @@
|
|||
// Code generated by sqlc. DO NOT EDIT.
|
||||
// versions:
|
||||
// sqlc v1.28.0
|
||||
|
||||
package sqlc
|
||||
|
||||
import (
|
||||
"database/sql/driver"
|
||||
"fmt"
|
||||
|
||||
"github.com/jackc/pgx/v5/pgtype"
|
||||
)
|
||||
|
||||
type Status string
|
||||
|
||||
const (
|
||||
StatusActive Status = "active"
|
||||
StatusOffline Status = "offline"
|
||||
StatusBusy Status = "busy"
|
||||
)
|
||||
|
||||
func (e *Status) Scan(src interface{}) error {
|
||||
switch s := src.(type) {
|
||||
case []byte:
|
||||
*e = Status(s)
|
||||
case string:
|
||||
*e = Status(s)
|
||||
default:
|
||||
return fmt.Errorf("unsupported scan type for Status: %T", src)
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
type NullStatus struct {
|
||||
Status Status
|
||||
Valid bool // Valid is true if Status is not NULL
|
||||
}
|
||||
|
||||
// Scan implements the Scanner interface.
|
||||
func (ns *NullStatus) Scan(value interface{}) error {
|
||||
if value == nil {
|
||||
ns.Status, ns.Valid = "", false
|
||||
return nil
|
||||
}
|
||||
ns.Valid = true
|
||||
return ns.Status.Scan(value)
|
||||
}
|
||||
|
||||
// Value implements the driver Valuer interface.
|
||||
func (ns NullStatus) Value() (driver.Value, error) {
|
||||
if !ns.Valid {
|
||||
return nil, nil
|
||||
}
|
||||
return string(ns.Status), nil
|
||||
}
|
||||
|
||||
type Satellite struct {
|
||||
ID pgtype.UUID
|
||||
DisplayName string
|
||||
Status Status
|
||||
}
|
||||
|
||||
type Station struct {
|
||||
ID pgtype.UUID
|
||||
Slug string
|
||||
Status Status
|
||||
}
|
||||
|
||||
type Subscription struct {
|
||||
ID pgtype.UUID
|
||||
UserID pgtype.UUID
|
||||
StationID pgtype.UUID
|
||||
SatelliteID pgtype.UUID
|
||||
CreatedAt pgtype.Timestamp
|
||||
UpdatedAt pgtype.Timestamp
|
||||
}
|
||||
|
||||
type User struct {
|
||||
ID pgtype.UUID
|
||||
Login string
|
||||
}
|
||||
25
internal/repository/sqlc/queries.sql.go
Normal file
25
internal/repository/sqlc/queries.sql.go
Normal file
|
|
@ -0,0 +1,25 @@
|
|||
// Code generated by sqlc. DO NOT EDIT.
|
||||
// versions:
|
||||
// sqlc v1.28.0
|
||||
// source: queries.sql
|
||||
|
||||
package sqlc
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"github.com/jackc/pgx/v5/pgtype"
|
||||
)
|
||||
|
||||
const getStationByID = `-- name: GetStationByID :one
|
||||
select id, slug, status
|
||||
from stations
|
||||
where id = $1
|
||||
`
|
||||
|
||||
func (q *Queries) GetStationByID(ctx context.Context, id pgtype.UUID) (Station, error) {
|
||||
row := q.db.QueryRow(ctx, getStationByID, id)
|
||||
var i Station
|
||||
err := row.Scan(&i.ID, &i.Slug, &i.Status)
|
||||
return i, err
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue