63 lines
1.3 KiB
Go
63 lines
1.3 KiB
Go
package services
|
|
|
|
import (
|
|
"context"
|
|
"crypto/rand"
|
|
"encoding/base64"
|
|
"errors"
|
|
"maot-shortner/internal/domain"
|
|
"maot-shortner/internal/repositories"
|
|
"strings"
|
|
"time"
|
|
)
|
|
|
|
type LinkService struct {
|
|
repo repositories.LinkRepository
|
|
}
|
|
|
|
func NewLinkService(repo repositories.LinkRepository) *LinkService {
|
|
return &LinkService{
|
|
repo: repo,
|
|
}
|
|
}
|
|
|
|
func (s *LinkService) GetLinks(ctx context.Context) ([]*domain.Link, error) {
|
|
return s.repo.GetLinks(ctx)
|
|
}
|
|
|
|
func (s *LinkService) CreateLink(ctx context.Context, longUrl string, redirectCode *string) (*domain.Link, error) {
|
|
if !strings.Contains(longUrl, "http://") && !strings.Contains(longUrl, "https://") {
|
|
return nil, errors.New("Invalid URL")
|
|
}
|
|
|
|
var shortUrl string
|
|
|
|
if redirectCode != nil {
|
|
shortUrl = *redirectCode
|
|
} else {
|
|
shortUrl = generateShortCode(5)
|
|
}
|
|
|
|
link := &domain.Link{
|
|
LongURL: longUrl,
|
|
ShortURL: shortUrl,
|
|
CreatedAt: time.Now(),
|
|
}
|
|
|
|
return s.repo.CreateLink(ctx, link)
|
|
}
|
|
|
|
func generateShortCode(length int) string {
|
|
b := make([]byte, length)
|
|
rand.Read(b)
|
|
if _, err := rand.Read(b); err != nil {
|
|
return ""
|
|
}
|
|
|
|
return base64.RawURLEncoding.EncodeToString(b)
|
|
}
|
|
|
|
func (s *LinkService) GetLink(ctx context.Context, shortUrl string) (*domain.Link, error) {
|
|
|
|
return s.repo.GetLinkByShortCode(ctx, shortUrl)
|
|
}
|