Add gRPC server implementation and database integration for marketplace and products

This commit is contained in:
2025-05-27 03:41:52 +03:00
parent 008f3df42d
commit b083cccc09
44 changed files with 2182 additions and 1201 deletions

View File

@@ -0,0 +1,46 @@
package marketplace
import (
"context"
"github.com/jackc/pgx/v5"
"google.golang.org/grpc"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
pb "sipro-mps/api/generated/v1/marketplace"
)
// AdapterGRPC implements the gRPC server for the Marketplace service.
type AdapterGRPC struct {
pb.UnimplementedMarketplaceServiceServer
repo Repository
}
func NewAdapterGRPC(repo Repository) *AdapterGRPC {
return &AdapterGRPC{
repo: repo,
}
}
func RegisterAdapterGRPC(server *grpc.Server) (*Repository, error) {
conn, err := pgx.Connect(context.Background(), "postgresql://postgres:GjitkeYf%5Beq@/sipro?host=/run/postgresql")
if err != nil {
return nil, err
}
repo := NewDBRepository(conn)
adapter := NewAdapterGRPC(repo)
pb.RegisterMarketplaceServiceServer(server, adapter)
return &repo, nil
}
func (g *AdapterGRPC) GetMarketplaceById(ctx context.Context, r *pb.GetMarketplaceByIdRequest) (*pb.Marketplace, error) {
mp, err := g.repo.GetMarketplaceByID(ctx, int(r.MarketplaceId))
if err != nil {
return nil, status.Errorf(codes.Internal, "failed to get marketplace by ID: %v", err)
}
return &pb.Marketplace{
Id: uint64(uint32(mp.ID)),
BaseMarketplace: uint32(int32(mp.BaseMarketplace)),
AuthData: mp.AuthData,
WarehouseId: mp.WarehouseID,
}, nil
}

View File

@@ -0,0 +1,32 @@
// Code generated by sqlc. DO NOT EDIT.
// versions:
// sqlc v1.28.0
package db
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,
}
}

View File

@@ -0,0 +1,17 @@
// Code generated by sqlc. DO NOT EDIT.
// versions:
// sqlc v1.28.0
package db
import (
"github.com/jackc/pgx/v5/pgtype"
)
type Marketplace struct {
ID int32
BaseMarketplace int32
Name string
AuthData pgtype.Text
WarehouseID pgtype.Text
}

View File

@@ -0,0 +1,3 @@
-- name: GetMarketplaceByID :one
SELECT * FROM marketplaces
WHERE id = $1 LIMIT 1;

View File

@@ -0,0 +1,28 @@
// Code generated by sqlc. DO NOT EDIT.
// versions:
// sqlc v1.28.0
// source: query.sql
package db
import (
"context"
)
const getMarketplaceByID = `-- name: GetMarketplaceByID :one
SELECT id, base_marketplace, name, auth_data, warehouse_id FROM marketplaces
WHERE id = $1 LIMIT 1
`
func (q *Queries) GetMarketplaceByID(ctx context.Context, id int32) (Marketplace, error) {
row := q.db.QueryRow(ctx, getMarketplaceByID, id)
var i Marketplace
err := row.Scan(
&i.ID,
&i.BaseMarketplace,
&i.Name,
&i.AuthData,
&i.WarehouseID,
)
return i, err
}

View File

@@ -0,0 +1,9 @@
create table marketplaces
(
id serial
primary key,
base_marketplace integer not null,
name varchar not null,
auth_data varchar,
warehouse_id varchar
);

View File

@@ -0,0 +1,10 @@
version: 2
sql:
- engine: "postgresql"
queries: "query.sql"
schema: "schema.sql"
gen:
go:
package: "db"
out: "."
sql_package: "pgx/v5"

View File

@@ -0,0 +1,8 @@
package marketplace
type Marketplace struct {
ID int `json:"id"`
BaseMarketplace int `json:"base_marketplace"`
AuthData string `json:"auth_data"`
WarehouseID string `json:"warehouse_id"`
}

View File

@@ -0,0 +1,8 @@
package marketplace
import "context"
type Repository interface {
// GetMarketplaceByID retrieves a marketplace by its ID.
GetMarketplaceByID(ctx context.Context, id int) (*Marketplace, error)
}

View File

@@ -0,0 +1,29 @@
package marketplace
import (
"context"
"github.com/jackc/pgx/v5"
"sipro-mps/internal/marketplace/db"
)
type dbRepository struct {
conn *pgx.Conn
}
func NewDBRepository(conn *pgx.Conn) Repository {
return &dbRepository{conn: conn}
}
func (r *dbRepository) GetMarketplaceByID(ctx context.Context, id int) (*Marketplace, error) {
queries := db.New(r.conn)
marketplace, err := queries.GetMarketplaceByID(ctx, int32(id))
if err != nil {
return nil, err
}
return &Marketplace{
ID: int(marketplace.ID),
BaseMarketplace: int(marketplace.BaseMarketplace),
AuthData: marketplace.AuthData.String,
WarehouseID: marketplace.WarehouseID.String,
}, nil
}