Copy syntax = "proto3";
package skeleton;
option go_package = "skeleton/pb/auth;auth";
message LoginInput {
string username = 1;
string password = 2;
}
message TokenResponse {
string token = 1;
}
service AuthService {
rpc Login(LoginInput) returns (TokenResponse) {}
}
Copy package grpcclient
import (
"google.golang.org/grpc"
)
func Close (conn map [ string ] * grpc . ClientConn ) {
for _, c := range conn {
c. Close ()
}
}
Copy package grpcconn
import (
"fmt"
"os"
"skeleton/lib/grpcclient"
"google.golang.org/grpc"
)
func ClientConn () ( map [ string ] * grpc . ClientConn , func (), error ) {
conn := make ( map [ string ] * grpc . ClientConn )
authConn, err := grpc. Dial (os. Getenv ( "AUTH_SERVICE" ), grpc. WithInsecure ())
if err != nil {
return nil , func () {}, fmt. Errorf ( "create auth service connection: %v " , err)
}
conn[ "AUTH" ] = authConn
return conn, func () { grpcclient. Close (conn) }, nil
}
Copy PORT = 7070
POSTGRES_HOST = localhost
POSTGRES_PORT = 5432
POSTGRES_USER = postgres
POSTGRES_PASSWORD = pass
POSTGRES_DB = drivers
AUTH_SERVICE = localhost:5050
Copy package main
import (
"log"
"net"
"os"
"skeleton/config"
"skeleton/grpcconn"
"skeleton/lib/database/postgres"
"skeleton/route"
_ "github.com/lib/pq"
"google.golang.org/grpc"
)
func main () {
config. Setup ( ".env" )
log := log. New (os.Stdout, "Skeleton : " , log.LstdFlags | log.Lmicroseconds | log.Lshortfile)
db, err := postgres. Open ()
if err != nil {
log. Fatalf ( "connecting to db: %v " , err)
return
}
log. Print ( "connecting to postgresql database" )
defer db. Close ()
// listen tcp port
lis, err := net. Listen ( "tcp" , ":" + os. Getenv ( "PORT" ))
if err != nil {
log. Fatalf ( "failed to listen: %v " , err)
return
}
grpcServer := grpc. NewServer ()
clientConn, clientClose, err := grpcconn. ClientConn ()
if err != nil {
log. Fatalf ( "failed to get grpc client connection: %v " , err)
return
}
defer clientClose ()
// routing grpc services
route. GrpcRoute (grpcServer, log, db, clientConn)
if err := grpcServer. Serve (lis); err != nil {
log. Fatalf ( "failed to serve: %s " , err)
return
}
log. Print ( "serve grpc on port: " + os. Getenv ( "PORT" ))
}
Copy package route
import (
"database/sql"
"log"
driverHandler "skeleton/domain/ddrivers/handler"
driverRepo "skeleton/domain/ddrivers/repositories"
driverUsecase "skeleton/domain/ddrivers/usecase"
"skeleton/pb/auth"
"skeleton/pb/drivers"
"google.golang.org/grpc"
)
func GrpcRoute (grpcServer * grpc . Server , log * log . Logger , db * sql . DB , clientConnection map [ string ] * grpc . ClientConn ) {
driverServer := driverHandler. NewDriverHandler (
driverUsecase. NewService (
log,
driverRepo. NewDriverRepo (db, log, auth. NewAuthServiceClient (clientConnection[ "AUTH" ]))),
)
drivers. RegisterDriversServiceServer (grpcServer, driverServer)
}
Copy package repositories
import (
"database/sql"
"log"
"skeleton/domain/ddrivers"
"skeleton/pb/auth"
"skeleton/pb/drivers"
)
type repo struct {
db * sql . DB
log * log . Logger
pb drivers . Driver
authClient auth . AuthServiceClient
}
func NewDriverRepo (db * sql . DB , log * log . Logger , authClient auth . AuthServiceClient ) ddrivers . DriverRepoInterface {
return & repo {
db: db,
log: log,
authClient: authClient,
}
}
func (u * repo ) GetPb () * drivers . Driver {
return & u.pb
}
func (u * repo ) SetPb (in * drivers . Driver ) {
if len (in.Id) > 0 {
u.pb.Id = in.Id
}
if len (in.Name) > 0 {
u.pb.Name = in.Name
}
if len (in.Phone) > 0 {
u.pb.Phone = in.Phone
}
if len (in.LicenceNumber) > 0 {
u.pb.LicenceNumber = in.LicenceNumber
}
if len (in.CompanyId) > 0 {
u.pb.CompanyId = in.CompanyId
}
if len (in.CompanyName) > 0 {
u.pb.CompanyName = in.CompanyName
}
u.pb.IsDelete = in.IsDelete
if len (in.Created) > 0 {
u.pb.Created = in.Created
}
if len (in.CreatedBy) > 0 {
u.pb.CreatedBy = in.CreatedBy
}
if len (in.Updated) > 0 {
u.pb.Updated = in.Updated
}
if len (in.UpdatedBy) > 0 {
u.pb.UpdatedBy = in.UpdatedBy
}
}
Copy loginInput := auth . LoginInput {username: "waresix" , password: "1234" }
response, err := u.authClient. Login (ctx, & loginInput)