diff --git a/main.go b/main.go index 1c7d398..36c1d6d 100644 --- a/main.go +++ b/main.go @@ -1,8 +1,6 @@ package main import ( - "backend/args_parser" - "backend/config" "backend/logger" "backend/src/handlers" "backend/src/middleware" @@ -10,6 +8,8 @@ import ( "backend/src/repo" "backend/src/services" "backend/src/utils" + "backend/utils/args_parser" + "backend/utils/config" "crypto/rsa" "crypto/x509" "database/sql" diff --git a/src/services/shortlink_service.go b/src/services/shortlink_service.go index d3f2469..9901b25 100644 --- a/src/services/shortlink_service.go +++ b/src/services/shortlink_service.go @@ -2,10 +2,8 @@ package services import ( "backend/src/repo" + "backend/src/utils" "fmt" - "math/rand" - "strings" - "time" ) type ShortlinkService interface { @@ -20,33 +18,18 @@ type NewShortlinkServiceParams struct { func NewShortlinkSevice(params NewShortlinkServiceParams) ShortlinkService { return &shortlinkService{ - cache: params.Cache, + randomUtil: *utils.NewRand(), + cache: params.Cache, } } type shortlinkService struct { - cache repo.Cache[string, string] -} - -func (s *shortlinkService) randomStr() string { - src := rand.NewSource(time.Now().UnixMicro()) - randGen := rand.New(src) - - builder := strings.Builder{} - for i := 0; i < 9; i++ { - offset := 0x41 - if randGen.Int()%2 == 1 { - offset = 0x61 - } - - byte := offset + (randGen.Int() % 26) - builder.WriteRune(rune(byte)) - } - return builder.String() + randomUtil utils.RandomUtil + cache repo.Cache[string, string] } func (s *shortlinkService) CreateLink(in string) (string, error) { - str := s.randomStr() + str := s.randomUtil.RandomID(10, utils.CharsetAll) s.cache.Set(str, in, 7*24*60*60) return str, nil } diff --git a/src/utils/random.go b/src/utils/random.go new file mode 100644 index 0000000..df07126 --- /dev/null +++ b/src/utils/random.go @@ -0,0 +1,70 @@ +package utils + +import ( + "math/rand" + "strings" + "time" +) + +type Charset int + +const ( + CharsetAll Charset = iota + CharsetLettersLower + CharsetLettersUpper + CharsetLetters + CharsetNumeric +) + +type charsetPart struct { + Offset int + Size int +} + +var charsets = map[Charset][]charsetPart{} + +func NewRand() *RandomUtil { + charsetLettersLower := charsetPart{ //CharsetLettersLower + Offset: 0x41, + Size: 26, + } + + charsetLettersUpper := charsetPart{ //CharsetLettersUpper + Offset: 0x61, + Size: 26, + } + + charsetNumeric := charsetPart{ //CharsetLettersNumeric + Offset: 0x30, + Size: 10, + } + + charsets = map[Charset][]charsetPart{ + CharsetNumeric: {charsetNumeric}, + CharsetLettersLower: {charsetLettersLower}, + CharsetLettersUpper: {charsetLettersUpper}, + CharsetLetters: {charsetLettersLower, charsetLettersUpper}, + CharsetAll: {charsetLettersLower, charsetLettersUpper, charsetNumeric}, + } + + return &RandomUtil{} +} + +type RandomUtil struct{} + +func (r *RandomUtil) RandomID(outputLenght int, charset Charset) string { + src := rand.NewSource(time.Now().UnixMicro()) + randGen := rand.New(src) + + charsetData := charsets[charset] + + builder := strings.Builder{} + for i := 0; i < outputLenght; i++ { + charsetIdx := randGen.Int() % len(charsetData) + charsetPart := charsetData[charsetIdx] + + byte := charsetPart.Offset + (randGen.Int() % charsetPart.Size) + builder.WriteRune(rune(byte)) + } + return builder.String() +} diff --git a/args_parser/args.go b/utils/args_parser/args.go similarity index 100% rename from args_parser/args.go rename to utils/args_parser/args.go diff --git a/config/config.go b/utils/config/config.go similarity index 100% rename from config/config.go rename to utils/config/config.go diff --git a/config/config_test.go b/utils/config/config_test.go similarity index 100% rename from config/config_test.go rename to utils/config/config_test.go diff --git a/config/new.go b/utils/config/new.go similarity index 100% rename from config/new.go rename to utils/config/new.go diff --git a/config/parser.go b/utils/config/parser.go similarity index 100% rename from config/parser.go rename to utils/config/parser.go