Первый прототип с основными возможностями
This commit is contained in:
38
services/key.go
Normal file
38
services/key.go
Normal file
@@ -0,0 +1,38 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"context"
|
||||
"math/rand"
|
||||
"time"
|
||||
|
||||
"code.gurenya.net/carlsmei/muninn-aio/db"
|
||||
"code.gurenya.net/carlsmei/muninn-aio/ent/link"
|
||||
)
|
||||
|
||||
// Key Generation Algorithm 6:51 MSK 29.07.24
|
||||
|
||||
var numChars = 8
|
||||
var keyAlphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"
|
||||
var seededRand *rand.Rand = rand.New(
|
||||
rand.NewSource(time.Now().UnixNano()))
|
||||
|
||||
func GenerateKey(ctx context.Context) string {
|
||||
client := db.GetEntClient()
|
||||
cond := false
|
||||
key := make([]byte, numChars)
|
||||
|
||||
for !cond {
|
||||
for i := range key {
|
||||
key[i] = keyAlphabet[seededRand.Intn(len(keyAlphabet))]
|
||||
}
|
||||
|
||||
exists, _ := client.Link.
|
||||
Query().
|
||||
Where(link.Key(string(key))).
|
||||
Exist(ctx)
|
||||
|
||||
cond = !exists
|
||||
}
|
||||
|
||||
return string(key)
|
||||
}
|
||||
44
services/link.go
Normal file
44
services/link.go
Normal file
@@ -0,0 +1,44 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"code.gurenya.net/carlsmei/muninn-aio/db"
|
||||
"code.gurenya.net/carlsmei/muninn-aio/ent"
|
||||
"code.gurenya.net/carlsmei/muninn-aio/ent/link"
|
||||
)
|
||||
|
||||
func CreateLink(ctx context.Context, user *ent.User, original_url string, key string) (*ent.Link, error) {
|
||||
client := db.GetEntClient()
|
||||
|
||||
if key == "" {
|
||||
key = GenerateKey(ctx)
|
||||
}
|
||||
|
||||
link, err := client.Link.Create().
|
||||
AddOwner(user).
|
||||
SetKey(key).
|
||||
SetOriginalURL(original_url).
|
||||
Save(ctx)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return link, nil
|
||||
}
|
||||
|
||||
func GetLinkByKey(ctx context.Context, key string) (*ent.Link, error) {
|
||||
client := db.GetEntClient()
|
||||
|
||||
link, err := client.Link.
|
||||
Query().
|
||||
Where(link.Key(key)).
|
||||
Only(ctx)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return link, nil
|
||||
}
|
||||
40
services/user.go
Normal file
40
services/user.go
Normal file
@@ -0,0 +1,40 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"code.gurenya.net/carlsmei/muninn-aio/db"
|
||||
"code.gurenya.net/carlsmei/muninn-aio/ent"
|
||||
"code.gurenya.net/carlsmei/muninn-aio/ent/user"
|
||||
)
|
||||
|
||||
func GetOrCreateUser(ctx context.Context, telegram_id int64) (*ent.User, error) {
|
||||
client := db.GetEntClient()
|
||||
|
||||
// fmt.Printf("GetOrCreateUser(context, %d)\n", telegram_id)
|
||||
|
||||
user, err := client.User.Query().
|
||||
Where(user.TelegramID(telegram_id)).
|
||||
Only(ctx)
|
||||
if err != nil {
|
||||
if ent.IsNotFound(err) {
|
||||
// fmt.Printf("user not found - creating user with telegram id %d\n", telegram_id)
|
||||
} else {
|
||||
return nil, err
|
||||
}
|
||||
} else {
|
||||
return user, nil
|
||||
}
|
||||
|
||||
user, err = client.User.Create().
|
||||
SetTelegramID(telegram_id).
|
||||
Save(ctx)
|
||||
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// fmt.Printf("user created with telegram id %d\n", telegram_id)
|
||||
|
||||
return user, nil
|
||||
}
|
||||
Reference in New Issue
Block a user