Skip to content

Commit 7b4328a

Browse files
committed
feat: Added Google Credentials, Env, TLS and filesystem loader functions
* Added Google Credentials, Env, TLS and filesystem loader functions * Added .gitignore file * Forked from 'github.com/pixel-plaza-dev/uru-databases-2-go-service-common'
1 parent 5a2f88b commit 7b4328a

18 files changed

+453
-0
lines changed

.gitignore

+19
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
# IDE folders
2+
/.idea
3+
/.vscode
4+
5+
# Environment variables
6+
/**/*.env
7+
8+
# Executable files
9+
/**/*.exe
10+
11+
# Private and public keys
12+
/**/*.ed
13+
/**/*.pub
14+
/**/*.pem
15+
16+
# Commands
17+
/**/*.cmd
18+
/**/*.sh
19+
/**/*.bat

cloud/gcloud/constants.go

+17
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package gcloud
2+
3+
type AuthorizationIdx int
4+
5+
const (
6+
TokenIdx AuthorizationIdx = iota
7+
)
8+
9+
// Int returns the integer value of the index
10+
func (i AuthorizationIdx) Int() int {
11+
return int(i)
12+
}
13+
14+
const (
15+
// AuthorizationMetadataKey is the key of the authorization metadata
16+
AuthorizationMetadataKey = "x-serverless-authorization"
17+
)

cloud/gcloud/errors.go

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
package gcloud
2+
3+
import "errors"
4+
5+
var (
6+
NilGoogleCredentialsError = errors.New("google credentials cannot be nil")
7+
NilTokenSourceError = errors.New("token source cannot be nil")
8+
FailedToLoadGoogleCredentialsError = errors.New("failed to load google credentials")
9+
FailedToCreateTokenSourceError = errors.New("failed to create token source")
10+
)

cloud/gcloud/loader.go

+40
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
package gcloud
2+
3+
import (
4+
"context"
5+
"golang.org/x/oauth2/google"
6+
"google.golang.org/api/idtoken"
7+
"google.golang.org/api/option"
8+
"google.golang.org/grpc/credentials/oauth"
9+
)
10+
11+
// LoadGoogleCredentials loads the Google credentials
12+
func LoadGoogleCredentials(ctx context.Context) (*google.Credentials, error) {
13+
credentials, err := google.FindDefaultCredentials(ctx)
14+
if err != nil {
15+
return nil, FailedToLoadGoogleCredentialsError
16+
}
17+
return credentials, nil
18+
}
19+
20+
// LoadServiceAccountCredentials loads the service account credentials
21+
func LoadServiceAccountCredentials(
22+
ctx context.Context, url string, credentials *google.Credentials,
23+
) (*oauth.TokenSource, error) {
24+
// Check if the credentials are nil
25+
if credentials == nil {
26+
return nil, NilGoogleCredentialsError
27+
}
28+
29+
// Create a new token source
30+
tokenSource, err := idtoken.NewTokenSource(
31+
ctx,
32+
url,
33+
option.WithCredentials(credentials),
34+
)
35+
if err != nil {
36+
return nil, FailedToCreateTokenSourceError
37+
}
38+
39+
return &oauth.TokenSource{TokenSource: tokenSource}, nil
40+
}

cloud/gcloud/logger.go

+47
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
package gcloud
2+
3+
import (
4+
gologger "github.com/ralvarezdev/go-logger"
5+
gologgerstatus "github.com/ralvarezdev/go-logger/status"
6+
"google.golang.org/grpc/credentials/oauth"
7+
)
8+
9+
// Logger is the logger for Google Cloud
10+
type Logger struct {
11+
logger gologger.Logger
12+
}
13+
14+
// NewLogger is the logger for Google Cloud
15+
func NewLogger(logger gologger.Logger) (*Logger, error) {
16+
// Check if the logger is nil
17+
if logger == nil {
18+
return nil, gologger.NilLoggerError
19+
}
20+
21+
return &Logger{logger: logger}, nil
22+
}
23+
24+
// LoadedTokenSource logs the loaded token source
25+
func (l *Logger) LoadedTokenSource(tokenSource *oauth.TokenSource) {
26+
// Check if the token source is nil
27+
if tokenSource == nil {
28+
l.logger.LogError(gologger.NewLogError("failed to load token source", nil, NilTokenSourceError))
29+
return
30+
}
31+
32+
// Get the access token from the token source
33+
token, err := tokenSource.Token()
34+
if err != nil {
35+
l.logger.LogError(gologger.NewLogError("failed to load token source", nil, err))
36+
return
37+
}
38+
39+
l.logger.LogMessage(
40+
gologger.NewLogMessage(
41+
"loaded token source",
42+
gologgerstatus.StatusDebug,
43+
nil,
44+
token.AccessToken,
45+
),
46+
)
47+
}

env/errors.go

+8
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
package env
2+
3+
import "errors"
4+
5+
var (
6+
EnvironmentVariableNotFoundError = "environment variable not found: %v"
7+
FailedToLoadEnvironmentVariablesError = errors.New("failed to load environment variables")
8+
)

env/loader.go

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package env
2+
3+
import (
4+
"fmt"
5+
"os"
6+
)
7+
8+
// LoadVariable load variable from environment variables
9+
func LoadVariable(key string) (uri string, err error) {
10+
// Get environment variable
11+
variable, exists := os.LookupEnv(key)
12+
if !exists {
13+
return "", fmt.Errorf(EnvironmentVariableNotFoundError, key)
14+
}
15+
return variable, nil
16+
}

env/logger.go

+33
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,33 @@
1+
package env
2+
3+
import (
4+
gologger "github.com/ralvarezdev/go-logger"
5+
gologgerstatus "github.com/ralvarezdev/go-logger/status"
6+
)
7+
8+
// Logger is the environment logger
9+
type Logger struct {
10+
logger gologger.Logger
11+
}
12+
13+
// NewLogger creates a new environment logger
14+
func NewLogger(logger gologger.Logger) (*Logger, error) {
15+
// Check if the logger is nil
16+
if logger == nil {
17+
return nil, gologger.NilLoggerError
18+
}
19+
20+
return &Logger{logger: logger}, nil
21+
}
22+
23+
// EnvironmentVariableLoaded logs a message when an environment variable is loaded
24+
func (l *Logger) EnvironmentVariableLoaded(variablesName ...string) {
25+
l.logger.LogMessage(
26+
gologger.NewLogMessage(
27+
"environment variable loaded",
28+
gologgerstatus.StatusDebug,
29+
nil,
30+
variablesName...,
31+
),
32+
)
33+
}

filesystem/errors.go

+5
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package filesystem
2+
3+
var (
4+
UnableToReadFileError = "unable to read file: %v"
5+
)

filesystem/read_files.go

+14
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
package filesystem
2+
3+
import (
4+
"os"
5+
)
6+
7+
// ReadFile reads the file from the given path
8+
func ReadFile(path string) ([]byte, error) {
9+
file, err := os.ReadFile(path)
10+
if err != nil {
11+
return nil, UnableToReadFileError
12+
}
13+
return file, nil
14+
}

filesystem/working_directory.go

+16
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
package filesystem
2+
3+
import (
4+
"os"
5+
"path/filepath"
6+
)
7+
8+
// GetCurrentDirectory gets the current directory of the executable
9+
func GetCurrentDirectory() (string, error) {
10+
execPath, err := os.Executable()
11+
if err != nil {
12+
return "", err
13+
}
14+
15+
return filepath.Dir(execPath), nil
16+
}

go.mod

+32
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
module github.com/ralvarezdev/go-loader
2+
3+
go 1.23.4
4+
5+
require (
6+
github.com/ralvarezdev/go-logger v0.1.0
7+
golang.org/x/oauth2 v0.24.0
8+
google.golang.org/api v0.213.0
9+
google.golang.org/grpc v1.69.0
10+
)
11+
12+
require (
13+
cloud.google.com/go/auth v0.13.0 // indirect
14+
cloud.google.com/go/auth/oauth2adapt v0.2.6 // indirect
15+
cloud.google.com/go/compute/metadata v0.6.0 // indirect
16+
github.com/felixge/httpsnoop v1.0.4 // indirect
17+
github.com/go-logr/logr v1.4.2 // indirect
18+
github.com/go-logr/stdr v1.2.2 // indirect
19+
github.com/google/s2a-go v0.1.8 // indirect
20+
github.com/googleapis/enterprise-certificate-proxy v0.3.4 // indirect
21+
github.com/googleapis/gax-go/v2 v2.14.0 // indirect
22+
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 // indirect
23+
go.opentelemetry.io/otel v1.31.0 // indirect
24+
go.opentelemetry.io/otel/metric v1.31.0 // indirect
25+
go.opentelemetry.io/otel/trace v1.31.0 // indirect
26+
golang.org/x/crypto v0.31.0 // indirect
27+
golang.org/x/net v0.32.0 // indirect
28+
golang.org/x/sys v0.28.0 // indirect
29+
golang.org/x/text v0.21.0 // indirect
30+
google.golang.org/genproto/googleapis/rpc v0.0.0-20241209162323-e6fa225c2576 // indirect
31+
google.golang.org/protobuf v1.35.2 // indirect
32+
)

go.sum

+71
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
cloud.google.com/go/auth v0.13.0 h1:8Fu8TZy167JkW8Tj3q7dIkr2v4cndv41ouecJx0PAHs=
2+
cloud.google.com/go/auth v0.13.0/go.mod h1:COOjD9gwfKNKz+IIduatIhYJQIc0mG3H102r/EMxX6Q=
3+
cloud.google.com/go/auth/oauth2adapt v0.2.6 h1:V6a6XDu2lTwPZWOawrAa9HUK+DB2zfJyTuciBG5hFkU=
4+
cloud.google.com/go/auth/oauth2adapt v0.2.6/go.mod h1:AlmsELtlEBnaNTL7jCj8VQFLy6mbZv0s4Q7NGBeQ5E8=
5+
cloud.google.com/go/compute/metadata v0.6.0 h1:A6hENjEsCDtC1k8byVsgwvVcioamEHvZ4j01OwKxG9I=
6+
cloud.google.com/go/compute/metadata v0.6.0/go.mod h1:FjyFAW1MW0C203CEOMDTu3Dk1FlqW3Rga40jzHL4hfg=
7+
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
8+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
9+
github.com/felixge/httpsnoop v1.0.4 h1:NFTV2Zj1bL4mc9sqWACXbQFVBBg2W3GPvqp8/ESS2Wg=
10+
github.com/felixge/httpsnoop v1.0.4/go.mod h1:m8KPJKqk1gH5J9DgRY2ASl2lWCfGKXixSwevea8zH2U=
11+
github.com/go-logr/logr v1.2.2/go.mod h1:jdQByPbusPIv2/zmleS9BjJVeZ6kBagPoEUsqbVz/1A=
12+
github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY=
13+
github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY=
14+
github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag=
15+
github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE=
16+
github.com/golang/protobuf v1.5.4 h1:i7eJL8qZTpSEXOPTxNKhASYpMn+8e5Q6AdndVa1dWek=
17+
github.com/golang/protobuf v1.5.4/go.mod h1:lnTiLA8Wa4RWRcIUkrtSVa5nRhsEGBg48fD6rSs7xps=
18+
github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI=
19+
github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
20+
github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM=
21+
github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA=
22+
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
23+
github.com/google/uuid v1.6.0/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo=
24+
github.com/googleapis/enterprise-certificate-proxy v0.3.4 h1:XYIDZApgAnrN1c855gTgghdIA6Stxb52D5RnLI1SLyw=
25+
github.com/googleapis/enterprise-certificate-proxy v0.3.4/go.mod h1:YKe7cfqYXjKGpGvmSg28/fFvhNzinZQm8DGnaburhGA=
26+
github.com/googleapis/gax-go/v2 v2.14.0 h1:f+jMrjBPl+DL9nI4IQzLUxMq7XrAqFYB7hBPqMNIe8o=
27+
github.com/googleapis/gax-go/v2 v2.14.0/go.mod h1:lhBCnjdLrWRaPvLWhmc8IS24m9mr07qSYnHncrgo+zk=
28+
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
29+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
30+
github.com/ralvarezdev/go-logger v0.1.0 h1:i2AI1nlxU6Hizvk75Vc8wtFydiVrqIeeRbJwiuO/69A=
31+
github.com/ralvarezdev/go-logger v0.1.0/go.mod h1:v5OvFrkS+wsYNTCVegXWiRhBtcYrQJr4LDMDntvpAos=
32+
github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg=
33+
github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY=
34+
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0 h1:r6I7RJCN86bpD/FQwedZ0vSixDpwuWREjW9oRMsmqDc=
35+
go.opentelemetry.io/contrib/instrumentation/google.golang.org/grpc/otelgrpc v0.54.0/go.mod h1:B9yO6b04uB80CzjedvewuqDhxJxi11s7/GtiGa8bAjI=
36+
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0 h1:TT4fX+nBOA/+LUkobKGW1ydGcn+G3vRw9+g5HwCphpk=
37+
go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.54.0/go.mod h1:L7UH0GbB0p47T4Rri3uHjbpCFYrVrwc1I25QhNPiGK8=
38+
go.opentelemetry.io/otel v1.31.0 h1:NsJcKPIW0D0H3NgzPDHmo0WW6SptzPdqg/L1zsIm2hY=
39+
go.opentelemetry.io/otel v1.31.0/go.mod h1:O0C14Yl9FgkjqcCZAsE053C13OaddMYr/hz6clDkEJE=
40+
go.opentelemetry.io/otel/metric v1.31.0 h1:FSErL0ATQAmYHUIzSezZibnyVlft1ybhy4ozRPcF2fE=
41+
go.opentelemetry.io/otel/metric v1.31.0/go.mod h1:C3dEloVbLuYoX41KpmAhOqNriGbA+qqH6PQ5E5mUfnY=
42+
go.opentelemetry.io/otel/sdk v1.31.0 h1:xLY3abVHYZ5HSfOg3l2E5LUj2Cwva5Y7yGxnSW9H5Gk=
43+
go.opentelemetry.io/otel/sdk v1.31.0/go.mod h1:TfRbMdhvxIIr/B2N2LQW2S5v9m3gOQ/08KsbbO5BPT0=
44+
go.opentelemetry.io/otel/sdk/metric v1.31.0 h1:i9hxxLJF/9kkvfHppyLL55aW7iIJz4JjxTeYusH7zMc=
45+
go.opentelemetry.io/otel/sdk/metric v1.31.0/go.mod h1:CRInTMVvNhUKgSAMbKyTMxqOBC0zgyxzW55lZzX43Y8=
46+
go.opentelemetry.io/otel/trace v1.31.0 h1:ffjsj1aRouKewfr85U2aGagJ46+MvodynlQ1HYdmJys=
47+
go.opentelemetry.io/otel/trace v1.31.0/go.mod h1:TXZkRk7SM2ZQLtR6eoAWQFIHPvzQ06FJAsO1tJg480A=
48+
golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
49+
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
50+
golang.org/x/net v0.32.0 h1:ZqPmj8Kzc+Y6e0+skZsuACbx+wzMgo5MQsJh9Qd6aYI=
51+
golang.org/x/net v0.32.0/go.mod h1:CwU0IoeOlnQQWJ6ioyFrfRuomB8GKF6KbYXZVyeXNfs=
52+
golang.org/x/oauth2 v0.24.0 h1:KTBBxWqUa0ykRPLtV69rRto9TLXcqYkeswu48x/gvNE=
53+
golang.org/x/oauth2 v0.24.0/go.mod h1:XYTD2NtWslqkgxebSiOHnXEap4TF09sJSc7H1sXbhtI=
54+
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
55+
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
56+
golang.org/x/sys v0.28.0 h1:Fksou7UEQUWlKvIdsqzJmUmCX3cZuD2+P3XyyzwMhlA=
57+
golang.org/x/sys v0.28.0/go.mod h1:/VUhepiaJMQUp4+oa/7Zr1D23ma6VTLIYjOOTFZPUcA=
58+
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
59+
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
60+
golang.org/x/time v0.8.0 h1:9i3RxcPv3PZnitoVGMPDKZSq1xW1gK1Xy3ArNOGZfEg=
61+
golang.org/x/time v0.8.0/go.mod h1:3BpzKBy/shNhVucY/MWOyx10tF3SFh9QdLuxbVysPQM=
62+
google.golang.org/api v0.213.0 h1:KmF6KaDyFqB417T68tMPbVmmwtIXs2VB60OJKIHB0xQ=
63+
google.golang.org/api v0.213.0/go.mod h1:V0T5ZhNUUNpYAlL306gFZPFt5F5D/IeyLoktduYYnvQ=
64+
google.golang.org/genproto/googleapis/rpc v0.0.0-20241209162323-e6fa225c2576 h1:8ZmaLZE4XWrtU3MyClkYqqtl6Oegr3235h7jxsDyqCY=
65+
google.golang.org/genproto/googleapis/rpc v0.0.0-20241209162323-e6fa225c2576/go.mod h1:5uTbfoYQed2U9p3KIj2/Zzm02PYhndfdmML0qC3q3FU=
66+
google.golang.org/grpc v1.69.0 h1:quSiOM1GJPmPH5XtU+BCoVXcDVJJAzNcoyfC2cCjGkI=
67+
google.golang.org/grpc v1.69.0/go.mod h1:vyjdE6jLBI76dgpDojsFGNaHlxdjXN9ghpnd2o7JGZ4=
68+
google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8io=
69+
google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE=
70+
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
71+
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=

http/listener/errors.go

+9
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
package listener
2+
3+
import "errors"
4+
5+
var (
6+
FailedToCloseError = errors.New("failed to close listener")
7+
FailedToListenError = errors.New("failed to listen")
8+
FailedToServeError = errors.New("failed to serve")
9+
)

http/listener/loader.go

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
package listener
2+
3+
import (
4+
goloaderenv "github.com/ralvarezdev/go-loader/env"
5+
"strings"
6+
)
7+
8+
// Port is the port of the server
9+
type Port struct {
10+
Port string
11+
Host string
12+
}
13+
14+
// LoadPort load port from environment variables
15+
func LoadPort(host string, key string) (
16+
*Port, error,
17+
) {
18+
// Get environment variable
19+
port, err := goloaderenv.LoadVariable(key)
20+
if err != nil {
21+
return nil, err
22+
}
23+
24+
// Build host string
25+
var hostBuilder strings.Builder
26+
hostBuilder.WriteString(host)
27+
hostBuilder.WriteString(":")
28+
hostBuilder.WriteString(port)
29+
30+
return &Port{
31+
Port: port,
32+
Host: hostBuilder.String(),
33+
}, nil
34+
}

0 commit comments

Comments
 (0)