Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
22 changes: 12 additions & 10 deletions .vscode/settings.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,12 @@
{
"prettier.arrowParens": "avoid",
"prettier.endOfLine": "crlf",

"files.associations": {
"*.css": "tailwindcss",
"*.scss": "tailwindcss"
},
"files.eol": "\r\n"
}
{
"prettier.arrowParens": "avoid",
"prettier.endOfLine": "crlf",

"files.associations": {
"*.css": "tailwindcss",
"*.scss": "tailwindcss"
},
"files.eol": "\r\n",
"cSpell.words": ["joho"]
}

13 changes: 13 additions & 0 deletions apps/server/.env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
APP_NAME=Fin
APP_VERSION=1.0.0

SERVER_PORT=8080

LOG_LEVEL=debug # or info, warn, error
LOG_FILE=logfile.log
LOG_PRETTY=true
LOG_CONSOLE=true

POSTGRES_URL=postgres://username:password@host:port/database
PG_POOL_MAX=2
=
42 changes: 23 additions & 19 deletions apps/server/cmd/app/main.go
Original file line number Diff line number Diff line change
@@ -1,19 +1,23 @@
package main

import (
"net/http"

"github.com/gin-gonic/gin"
)

func main() {
println("Hello, Fin server!")

r := gin.Default()
r.GET("/", func (c *gin.Context) {
c.JSON(http.StatusOK, gin.H{
"message": "Hello, Fin server!",
})
})
r.Run() // listen and serve on
}
package main

import (
"log"

"flakeforge/fin/config"
"flakeforge/fin/internal/app"

"github.com/joho/godotenv"
)

func main() {
if err := godotenv.Load(); err != nil{
log.Printf("Warning: .env file not found: %v", err)
}

config, err := config.New()
if err != nil {
log.Printf("Warning: .env file not found: %v", err)
}

app.Run(config)
}
40 changes: 40 additions & 0 deletions apps/server/config/config.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
package config

import (
"fmt"

"github.com/caarlos0/env/v11"
)

type (
Config struct {
App App
Logger Logger
Postgres Postgres
}

App struct {
Name string `env:"APP_NAME" envDefault:"fin"`
Version string `env:"APP_VERSION" envDefault:"1.0.0"`
Port string `env:"SERVER_PORT" envDefault:"8080"`
}
Logger struct {
Level string `env:"LOG_LEVEL" envDefault:"info"`
LogFile string `env:"LOG_FILE" envDefault:"logs/app.log"`
Pretty bool `env:"LOG_PRETTY" envDefault:"true"`
Console bool `env:"LOG_CONSOLE" envDefault:"true"`
}
Postgres struct {
URL string `env:"POSTGRES_URL,required"`
PoolMax int `env:"PG_POOL_MAX" envDefault:"10"`
}
)

func New() (*Config, error) {
config := &Config{}
if err := env.Parse(config); err != nil {
return nil, fmt.Errorf("failed to parse config: %w", err)
}

return config, nil
}
5 changes: 5 additions & 0 deletions apps/server/go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,23 +4,28 @@ go 1.23.5

require github.com/gin-gonic/gin v1.10.1

require github.com/mattn/go-colorable v0.1.13 // indirect

require (
github.com/bytedance/sonic v1.14.0 // indirect
github.com/bytedance/sonic/loader v0.3.0 // indirect
github.com/caarlos0/env/v11 v11.3.1 // indirect
github.com/cloudwego/base64x v0.1.6 // indirect
github.com/gabriel-vasile/mimetype v1.4.9 // indirect
github.com/gin-contrib/sse v1.1.0 // indirect
github.com/go-playground/locales v0.14.1 // indirect
github.com/go-playground/universal-translator v0.18.1 // indirect
github.com/go-playground/validator/v10 v10.27.0 // indirect
github.com/goccy/go-json v0.10.5 // indirect
github.com/joho/godotenv v1.5.1
github.com/json-iterator/go v1.1.12 // indirect
github.com/klauspost/cpuid/v2 v2.3.0 // indirect
github.com/leodido/go-urn v1.4.0 // indirect
github.com/mattn/go-isatty v0.0.20 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/pelletier/go-toml/v2 v2.2.4 // indirect
github.com/rs/zerolog v1.34.0
github.com/twitchyliquid64/golang-asm v0.15.1 // indirect
github.com/ugorji/go/codec v1.3.0 // indirect
golang.org/x/arch v0.20.0 // indirect
Expand Down
16 changes: 16 additions & 0 deletions apps/server/go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,11 @@ github.com/bytedance/sonic v1.14.0 h1:/OfKt8HFw0kh2rj8N0F6C/qPGRESq0BbaNZgcNXXzQ
github.com/bytedance/sonic v1.14.0/go.mod h1:WoEbx8WTcFJfzCe0hbmyTGrfjt8PzNEBdxlNUO24NhA=
github.com/bytedance/sonic/loader v0.3.0 h1:dskwH8edlzNMctoruo8FPTJDF3vLtDT0sXZwvZJyqeA=
github.com/bytedance/sonic/loader v0.3.0/go.mod h1:N8A3vUdtUebEY2/VQC0MyhYeKUFosQU6FxH2JmUe6VI=
github.com/caarlos0/env/v11 v11.3.1 h1:cArPWC15hWmEt+gWk7YBi7lEXTXCvpaSdCiZE2X5mCA=
github.com/caarlos0/env/v11 v11.3.1/go.mod h1:qupehSf/Y0TUTsxKywqRt/vJjN5nz6vauiYEUUr8P4U=
github.com/cloudwego/base64x v0.1.6 h1:t11wG9AECkCDk5fMSoxmufanudBtJ+/HemLstXDLI2M=
github.com/cloudwego/base64x v0.1.6/go.mod h1:OFcloc187FXDaYHvrNIjxSe8ncn0OOM8gEHfghB2IPU=
github.com/coreos/go-systemd/v22 v22.5.0/go.mod h1:Y58oyj3AT4RCenI/lSvhwexgC+NSVTIJ3seZv2GcEnc=
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
Expand All @@ -23,15 +26,22 @@ github.com/go-playground/validator/v10 v10.27.0 h1:w8+XrWVMhGkxOaaowyKH35gFydVHO
github.com/go-playground/validator/v10 v10.27.0/go.mod h1:I5QpIEbmr8On7W0TktmJAumgzX4CA1XNl4ZmDuVHKKo=
github.com/goccy/go-json v0.10.5 h1:Fq85nIqj+gXn/S5ahsiTlK3TmC85qgirsdTP/+DeaC4=
github.com/goccy/go-json v0.10.5/go.mod h1:oq7eo15ShAhp70Anwd5lgX2pLfOS3QCiwU/PULtXL6M=
github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA=
github.com/google/go-cmp v0.7.0 h1:wk8382ETsv4JYUZwIsn6YpYiWiBsYLSJiTsyBybVuN8=
github.com/google/go-cmp v0.7.0/go.mod h1:pXiqmnSA92OHEEa9HXL2W4E7lf9JzCmGVUdgjX3N/iU=
github.com/google/gofuzz v1.0.0/go.mod h1:dBl0BpW6vV/+mYPU4Po3pmUjxk6FQPldtuIdl/M65Eg=
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=
github.com/json-iterator/go v1.1.12 h1:PV8peI4a0ysnczrg+LtxykD8LfKY9ML6u2jnxaEnrnM=
github.com/json-iterator/go v1.1.12/go.mod h1:e30LSqwooZae/UwlEbR2852Gd8hjQvJoHmT4TnhNGBo=
github.com/klauspost/cpuid/v2 v2.3.0 h1:S4CRMLnYUhGeDFDqkGriYKdfoFlDnMtqTiI/sFzhA9Y=
github.com/klauspost/cpuid/v2 v2.3.0/go.mod h1:hqwkgyIinND0mEev00jJYCxPNVRVXFQeu1XKlok6oO0=
github.com/leodido/go-urn v1.4.0 h1:WT9HwE9SGECu3lg4d/dIA+jxlljEa1/ffXKmRjqdmIQ=
github.com/leodido/go-urn v1.4.0/go.mod h1:bvxc+MVxLKB4z00jd1z+Dvzr47oO32F/QSNjSBOlFxI=
github.com/mattn/go-colorable v0.1.13 h1:fFA4WZxdEF4tXPZVKMLwD8oUnCTTo08duU7wxecdEvA=
github.com/mattn/go-colorable v0.1.13/go.mod h1:7S9/ev0klgBDR4GtXTXX8a3vIGJpMovkB8vQcUbaXHg=
github.com/mattn/go-isatty v0.0.16/go.mod h1:kYGgaQfpe5nmfYZH+SKPsOc2e4SrIfOl2e/yFXSvRLM=
github.com/mattn/go-isatty v0.0.19/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY=
github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y=
github.com/modern-go/concurrent v0.0.0-20180228061459-e0a39a4cb421/go.mod h1:6dJC0mAP4ikYIbvyc7fijjWJddQyLn8Ig3JB5CqoB9Q=
Expand All @@ -41,8 +51,12 @@ github.com/modern-go/reflect2 v1.0.2 h1:xBagoLtFs94CBntxluKeaWgTMpvLxC4ur3nMaC9G
github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk=
github.com/pelletier/go-toml/v2 v2.2.4 h1:mye9XuhQ6gvn5h28+VilKrrPoQVanw5PMw/TB0t5Ec4=
github.com/pelletier/go-toml/v2 v2.2.4/go.mod h1:2gIqNv+qfxSVS7cM2xJQKtLSTLUE9V8t9Stt+h56mCY=
github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
github.com/rs/xid v1.6.0/go.mod h1:7XoLgs4eV+QndskICGsho+ADou8ySMSjJKDIan90Nz0=
github.com/rs/zerolog v1.34.0 h1:k43nTLIwcTVQAncfCw4KZ2VY6ukYoZaBPNOE8txlOeY=
github.com/rs/zerolog v1.34.0/go.mod h1:bJsvje4Z08ROH4Nhs5iH600c3IkWhwp44iRc54W6wYQ=
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
Expand All @@ -62,7 +76,9 @@ golang.org/x/crypto v0.41.0 h1:WKYxWedPGCTVVl5+WHSSrOBT0O8lx32+zxmHxijgXp4=
golang.org/x/crypto v0.41.0/go.mod h1:pO5AFd7FA68rFak7rOAGVuygIISepHftHnr8dr6+sUc=
golang.org/x/net v0.43.0 h1:lat02VYK2j4aLzMzecihNvTlJNQUq316m2Mr9rnM6YE=
golang.org/x/net v0.43.0/go.mod h1:vhO1fvI4dGsIjh73sWfUVjj3N7CA9WkKJNQm2svM6Jg=
golang.org/x/sys v0.0.0-20220811171246-fbc7d0a398ab/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.12.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
golang.org/x/sys v0.35.0 h1:vz1N37gP5bs89s7He8XuIYXpyY0+QlsKmzipCbUtyxI=
golang.org/x/sys v0.35.0/go.mod h1:BJP2sWEmIv4KK5OTEluFJCKSidICx8ciO85XgH3Ak8k=
golang.org/x/text v0.28.0 h1:rhazDwis8INMIwQ4tpjLDzUhx6RlXqZNPEM0huQojng=
Expand Down
10 changes: 10 additions & 0 deletions apps/server/internal/app/app.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,10 @@
package app

import (
"flakeforge/fin/config"
"flakeforge/fin/pkg/logger"
)

func Run(cfg *config.Config) {
l := logger.New(cfg.Logger.Level)
}
98 changes: 98 additions & 0 deletions apps/server/pkg/logger/logger.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,98 @@
package logger

import (
"fmt"
"os"
"strings"

"github.com/rs/zerolog"
)

type Interface interface {
Debug(message interface{}, args ...interface{})
Info(message string, args ...interface{})
Warn(message string, args ...interface{})
Error(message interface{}, args ...interface{})
Fatal(message interface{}, args ...interface{})
}

type Logger struct {
logger *zerolog.Logger
}

var _ Interface = (*Logger)(nil)

func New(level string) *Logger {
var l zerolog.Level

switch strings.ToLower(level) {
case "error":
l = zerolog.ErrorLevel
case "warn":
l = zerolog.WarnLevel
case "info":
l = zerolog.InfoLevel
case "debug":
l = zerolog.DebugLevel
default:
l = zerolog.InfoLevel
}

zerolog.SetGlobalLevel(l)

skipFrameCount := 3

logger := zerolog.New(os.Stdout).
With().
Timestamp().
CallerWithSkipFrameCount(zerolog.CallerSkipFrameCount + skipFrameCount).
Logger()

return &Logger{
logger: &logger,
}
}

func (l *Logger) Debug(message interface{}, args ...interface{}) {
l.msg("debug", message, args...)
}

func (l *Logger) Info(message string, args ...interface{}) {
l.log(message, args...)
}

func (l *Logger) Warn(message string, args ...interface{}) {
l.log(message, args...)
}

func (l *Logger) Error(message interface{}, args ...interface{}) {
if l.logger.GetLevel() == zerolog.DebugLevel {
l.Debug(message, args...)
}

l.msg("error", message, args...)
}

func (l *Logger) Fatal(message interface{}, args ...interface{}) {
l.msg("fatal", message, args...)
os.Exit(1)
}

func (l *Logger) log(message string, args ...interface{}) {
if len(args) == 0 {
l.logger.Info().Msg(message)
} else {
l.logger.Info().Msgf(message, args...)
}
}

func (l *Logger) msg(level string, message interface{}, args ...interface{}) {
switch msg := message.(type) {
case error:
l.log(msg.Error(), args...)
case string:
l.log(msg, args...)
default:
l.log(fmt.Sprintf("%s message %v has unknown type %T", level, message, msg), args...)
}
}
23 changes: 13 additions & 10 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,10 +1,13 @@
{
"name": "fin",
"version": "1.0.0",
"private": false,
"scripts": {
"postinstall": "moon :installDeps"
},
"dependencies": {},
"devDependencies": {}
}
{
"name": "fin",
"version": "1.0.0",
"private": false,
"author": {
"name": "FlakeForge team",
"email": "[email protected]",
"url": "https://.flakeforge.uz"
},
"scripts": {
"postinstall": "moon :installDeps"
}
}
3 changes: 3 additions & 0 deletions pnpm-lock.yaml

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.