ticket setup
This commit is contained in:
parent
63b443171d
commit
731343feef
|
|
@ -7,6 +7,7 @@ import (
|
||||||
|
|
||||||
"github.com/SamuelTariku/FortuneBet-Backend/internal/config"
|
"github.com/SamuelTariku/FortuneBet-Backend/internal/config"
|
||||||
"github.com/SamuelTariku/FortuneBet-Backend/internal/repository"
|
"github.com/SamuelTariku/FortuneBet-Backend/internal/repository"
|
||||||
|
// httpserver "github.com/SamuelTariku/FortuneBet-Backend/internal/web_server"
|
||||||
"github.com/joho/godotenv"
|
"github.com/joho/godotenv"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
|
@ -28,4 +29,7 @@ func main() {
|
||||||
}
|
}
|
||||||
store := repository.NewStore(db)
|
store := repository.NewStore(db)
|
||||||
fmt.Println(store)
|
fmt.Println(store)
|
||||||
|
|
||||||
|
// app := httpserver.NewApp(cfg.Port)
|
||||||
|
// app.Run()
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -72,3 +72,7 @@ DROP TABLE IF EXISTS ussd_account;
|
||||||
DROP TYPE IF EXISTS ua_pin_status;
|
DROP TYPE IF EXISTS ua_pin_status;
|
||||||
DROP TYPE IF EXISTS ua_status;
|
DROP TYPE IF EXISTS ua_status;
|
||||||
DROP TYPE IF EXISTS ua_registaration_type;
|
DROP TYPE IF EXISTS ua_registaration_type;
|
||||||
|
|
||||||
|
-- Drop Ticket
|
||||||
|
DROP TABLE IF EXIST ticket;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -10,3 +10,11 @@ CREATE TABLE users (
|
||||||
created_at TIMESTAMP ,
|
created_at TIMESTAMP ,
|
||||||
updated_at TIMESTAMP
|
updated_at TIMESTAMP
|
||||||
);
|
);
|
||||||
|
|
||||||
|
CREATE TABLE IF NOT EXISTS tickets (
|
||||||
|
id BIGSERIAL PRIMARY KEY,
|
||||||
|
amount DECIMAL(12,2) NULL,
|
||||||
|
total_odds DECIMAL(12,2) NOT NULL,
|
||||||
|
created_at TIMESTAMP,
|
||||||
|
updated_at TIMESTAMP
|
||||||
|
);
|
||||||
|
|
|
||||||
16
db/query/ticket.sql
Normal file
16
db/query/ticket.sql
Normal file
|
|
@ -0,0 +1,16 @@
|
||||||
|
-- name: CreateTicket :one
|
||||||
|
INSERT INTO tickets (id, amount, total_odds)
|
||||||
|
VALUES ($1, $2, $3)
|
||||||
|
RETURNING *;
|
||||||
|
|
||||||
|
-- name: GetAllTickets :many
|
||||||
|
SELECT * FROM tickets;
|
||||||
|
|
||||||
|
-- name: GetTicketByID :one
|
||||||
|
SELECT * FROM tickets WHERE id = $1;
|
||||||
|
|
||||||
|
-- name: DeleteTicket :exec
|
||||||
|
DELETE FROM tickets WHERE id = $1;
|
||||||
|
|
||||||
|
-- name: DeleteOldTickets :exec
|
||||||
|
Delete from tickets where created_at < now() - interval '1 day';
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
// Code generated by sqlc. DO NOT EDIT.
|
// Code generated by sqlc. DO NOT EDIT.
|
||||||
// versions:
|
// versions:
|
||||||
// sqlc v1.26.0
|
// sqlc v1.28.0
|
||||||
|
|
||||||
package dbgen
|
package dbgen
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
// Code generated by sqlc. DO NOT EDIT.
|
// Code generated by sqlc. DO NOT EDIT.
|
||||||
// versions:
|
// versions:
|
||||||
// sqlc v1.26.0
|
// sqlc v1.28.0
|
||||||
|
|
||||||
package dbgen
|
package dbgen
|
||||||
|
|
||||||
|
|
@ -8,6 +8,14 @@ import (
|
||||||
"github.com/jackc/pgx/v5/pgtype"
|
"github.com/jackc/pgx/v5/pgtype"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type Ticket struct {
|
||||||
|
ID int64
|
||||||
|
Amount pgtype.Numeric
|
||||||
|
TotalOdds pgtype.Numeric
|
||||||
|
CreatedAt pgtype.Timestamp
|
||||||
|
UpdatedAt pgtype.Timestamp
|
||||||
|
}
|
||||||
|
|
||||||
type User struct {
|
type User struct {
|
||||||
ID int64
|
ID int64
|
||||||
FirstName string
|
FirstName string
|
||||||
|
|
|
||||||
102
gen/db/ticket.sql.go
Normal file
102
gen/db/ticket.sql.go
Normal file
|
|
@ -0,0 +1,102 @@
|
||||||
|
// Code generated by sqlc. DO NOT EDIT.
|
||||||
|
// versions:
|
||||||
|
// sqlc v1.28.0
|
||||||
|
// source: ticket.sql
|
||||||
|
|
||||||
|
package dbgen
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/jackc/pgx/v5/pgtype"
|
||||||
|
)
|
||||||
|
|
||||||
|
const CreateTicket = `-- name: CreateTicket :one
|
||||||
|
INSERT INTO tickets (id, amount, total_odds)
|
||||||
|
VALUES ($1, $2, $3)
|
||||||
|
RETURNING id, amount, total_odds, created_at, updated_at
|
||||||
|
`
|
||||||
|
|
||||||
|
type CreateTicketParams struct {
|
||||||
|
ID int64
|
||||||
|
Amount pgtype.Numeric
|
||||||
|
TotalOdds pgtype.Numeric
|
||||||
|
}
|
||||||
|
|
||||||
|
func (q *Queries) CreateTicket(ctx context.Context, arg CreateTicketParams) (Ticket, error) {
|
||||||
|
row := q.db.QueryRow(ctx, CreateTicket, arg.ID, arg.Amount, arg.TotalOdds)
|
||||||
|
var i Ticket
|
||||||
|
err := row.Scan(
|
||||||
|
&i.ID,
|
||||||
|
&i.Amount,
|
||||||
|
&i.TotalOdds,
|
||||||
|
&i.CreatedAt,
|
||||||
|
&i.UpdatedAt,
|
||||||
|
)
|
||||||
|
return i, err
|
||||||
|
}
|
||||||
|
|
||||||
|
const DeleteOldTickets = `-- name: DeleteOldTickets :exec
|
||||||
|
Delete from tickets where created_at < now() - interval '1 day'
|
||||||
|
`
|
||||||
|
|
||||||
|
func (q *Queries) DeleteOldTickets(ctx context.Context) error {
|
||||||
|
_, err := q.db.Exec(ctx, DeleteOldTickets)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
const DeleteTicket = `-- name: DeleteTicket :exec
|
||||||
|
DELETE FROM tickets WHERE id = $1
|
||||||
|
`
|
||||||
|
|
||||||
|
func (q *Queries) DeleteTicket(ctx context.Context, id int64) error {
|
||||||
|
_, err := q.db.Exec(ctx, DeleteTicket, id)
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
const GetAllTickets = `-- name: GetAllTickets :many
|
||||||
|
SELECT id, amount, total_odds, created_at, updated_at FROM tickets
|
||||||
|
`
|
||||||
|
|
||||||
|
func (q *Queries) GetAllTickets(ctx context.Context) ([]Ticket, error) {
|
||||||
|
rows, err := q.db.Query(ctx, GetAllTickets)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer rows.Close()
|
||||||
|
var items []Ticket
|
||||||
|
for rows.Next() {
|
||||||
|
var i Ticket
|
||||||
|
if err := rows.Scan(
|
||||||
|
&i.ID,
|
||||||
|
&i.Amount,
|
||||||
|
&i.TotalOdds,
|
||||||
|
&i.CreatedAt,
|
||||||
|
&i.UpdatedAt,
|
||||||
|
); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
items = append(items, i)
|
||||||
|
}
|
||||||
|
if err := rows.Err(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return items, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
const GetTicketByID = `-- name: GetTicketByID :one
|
||||||
|
SELECT id, amount, total_odds, created_at, updated_at FROM tickets WHERE id = $1
|
||||||
|
`
|
||||||
|
|
||||||
|
func (q *Queries) GetTicketByID(ctx context.Context, id int64) (Ticket, error) {
|
||||||
|
row := q.db.QueryRow(ctx, GetTicketByID, id)
|
||||||
|
var i Ticket
|
||||||
|
err := row.Scan(
|
||||||
|
&i.ID,
|
||||||
|
&i.Amount,
|
||||||
|
&i.TotalOdds,
|
||||||
|
&i.CreatedAt,
|
||||||
|
&i.UpdatedAt,
|
||||||
|
)
|
||||||
|
return i, err
|
||||||
|
}
|
||||||
|
|
@ -1,6 +1,6 @@
|
||||||
// Code generated by sqlc. DO NOT EDIT.
|
// Code generated by sqlc. DO NOT EDIT.
|
||||||
// versions:
|
// versions:
|
||||||
// sqlc v1.26.0
|
// sqlc v1.28.0
|
||||||
// source: user.sql
|
// source: user.sql
|
||||||
|
|
||||||
package dbgen
|
package dbgen
|
||||||
|
|
|
||||||
9
internal/domain/ticket.go
Normal file
9
internal/domain/ticket.go
Normal file
|
|
@ -0,0 +1,9 @@
|
||||||
|
package domain
|
||||||
|
|
||||||
|
// TODO: Adding Outcome Array Once the event is done
|
||||||
|
// ID will serve as the fast code since this doesn't need to be secure
|
||||||
|
type Ticket struct {
|
||||||
|
ID int64
|
||||||
|
Amount int32
|
||||||
|
TotalOdds int32
|
||||||
|
}
|
||||||
72
internal/repository/ticket.go
Normal file
72
internal/repository/ticket.go
Normal file
|
|
@ -0,0 +1,72 @@
|
||||||
|
package repository
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
dbgen "github.com/SamuelTariku/FortuneBet-Backend/gen/db"
|
||||||
|
"github.com/SamuelTariku/FortuneBet-Backend/internal/domain"
|
||||||
|
"github.com/jackc/pgx/v5/pgtype"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (s *Store) CreateTicket(ctx context.Context, amount int32, totalOdds int32) (domain.Ticket, error) {
|
||||||
|
|
||||||
|
ticket, err := s.queries.CreateTicket(ctx, dbgen.CreateTicketParams{
|
||||||
|
Amount: pgtype.Numeric{
|
||||||
|
Exp: amount,
|
||||||
|
},
|
||||||
|
TotalOdds: pgtype.Numeric{
|
||||||
|
Exp: totalOdds,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return domain.Ticket{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return domain.Ticket{
|
||||||
|
ID: ticket.ID,
|
||||||
|
Amount: ticket.Amount.Exp,
|
||||||
|
TotalOdds: ticket.TotalOdds.Exp,
|
||||||
|
}, err
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Store) GetTicketByID(ctx context.Context, id int64) (domain.Ticket, error) {
|
||||||
|
ticket, err := s.queries.GetTicketByID(ctx, id)
|
||||||
|
if err != nil {
|
||||||
|
return domain.Ticket{}, err
|
||||||
|
}
|
||||||
|
|
||||||
|
return domain.Ticket{
|
||||||
|
ID: ticket.ID,
|
||||||
|
Amount: ticket.Amount.Exp,
|
||||||
|
TotalOdds: ticket.TotalOdds.Exp,
|
||||||
|
}, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Store) GetAllTickets(ctx context.Context) ([]domain.Ticket, error) {
|
||||||
|
tickets, err := s.queries.GetAllTickets(ctx)
|
||||||
|
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
|
||||||
|
var result []domain.Ticket
|
||||||
|
for _, ticket := range tickets {
|
||||||
|
result = append(result, domain.Ticket{
|
||||||
|
ID: ticket.ID,
|
||||||
|
Amount: ticket.Amount.Exp,
|
||||||
|
TotalOdds: ticket.TotalOdds.Exp,
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return result, nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Store) DeleteOldTickets(ctx context.Context) error {
|
||||||
|
return s.queries.DeleteOldTickets(ctx)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Store) DeleteTicket(ctx context.Context, id int64) error {
|
||||||
|
return s.queries.DeleteTicket(ctx, id)
|
||||||
|
}
|
||||||
15
internal/services/ticket/port.go
Normal file
15
internal/services/ticket/port.go
Normal file
|
|
@ -0,0 +1,15 @@
|
||||||
|
package ticket
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/SamuelTariku/FortuneBet-Backend/internal/domain"
|
||||||
|
)
|
||||||
|
|
||||||
|
type TicketStore interface {
|
||||||
|
CreateTicket(ctx context.Context, amount int32, totalOdds int32) (domain.Ticket, error)
|
||||||
|
GetTicketByID(ctx context.Context, id int64) (domain.Ticket, error)
|
||||||
|
GetAllTickets(ctx context.Context) ([]domain.Ticket, error)
|
||||||
|
DeleteOldTickets(ctx context.Context) error
|
||||||
|
DeleteTicket(ctx context.Context, id int64) error
|
||||||
|
}
|
||||||
34
internal/services/ticket/service.go
Normal file
34
internal/services/ticket/service.go
Normal file
|
|
@ -0,0 +1,34 @@
|
||||||
|
package ticket
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
|
||||||
|
"github.com/SamuelTariku/FortuneBet-Backend/internal/domain"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Service struct {
|
||||||
|
ticketStore TicketStore
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewService(ticketStore TicketStore) *Service {
|
||||||
|
return &Service{
|
||||||
|
ticketStore: ticketStore,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Service) CreateUser(ctx context.Context, amount int32, totalOdds int32) (domain.Ticket, error) {
|
||||||
|
return s.ticketStore.CreateTicket(ctx, amount, totalOdds)
|
||||||
|
}
|
||||||
|
func (s *Service) GetTicketByID(ctx context.Context, id int64) (domain.Ticket, error) {
|
||||||
|
return s.ticketStore.GetTicketByID(ctx, id)
|
||||||
|
}
|
||||||
|
func (s *Service) GetAllTickets(ctx context.Context) ([]domain.Ticket, error) {
|
||||||
|
return s.ticketStore.GetAllTickets(ctx)
|
||||||
|
}
|
||||||
|
func (s *Service) DeleteTicket(ctx context.Context, id int64) error {
|
||||||
|
return s.ticketStore.DeleteTicket(ctx, id)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *Service) DeleteOldTickets(ctx context.Context) error {
|
||||||
|
return s.ticketStore.DeleteOldTickets(ctx)
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user