primer intento de servicio para acortar urls
This commit is contained in:
5
dto/reqbody.go
Normal file
5
dto/reqbody.go
Normal file
@@ -0,0 +1,5 @@
|
||||
package dto
|
||||
|
||||
type ReqBody struct {
|
||||
LongUrl string `json:"longUrl"`
|
||||
}
|
||||
12
go.mod
Normal file
12
go.mod
Normal file
@@ -0,0 +1,12 @@
|
||||
module url-short
|
||||
|
||||
go 1.25.7
|
||||
|
||||
require (
|
||||
github.com/jinzhu/inflection v1.0.0 // indirect
|
||||
github.com/jinzhu/now v1.1.5 // indirect
|
||||
github.com/mattn/go-sqlite3 v1.14.34 // indirect
|
||||
golang.org/x/text v0.35.0 // indirect
|
||||
gorm.io/driver/sqlite v1.6.0 // indirect
|
||||
gorm.io/gorm v1.31.1 // indirect
|
||||
)
|
||||
12
go.sum
Normal file
12
go.sum
Normal file
@@ -0,0 +1,12 @@
|
||||
github.com/jinzhu/inflection v1.0.0 h1:K317FqzuhWc8YvSVlFMCCUb36O/S9MCKRDI7QkRKD/E=
|
||||
github.com/jinzhu/inflection v1.0.0/go.mod h1:h+uFLlag+Qp1Va5pdKtLDYj+kHp5pxUVkryuEj+Srlc=
|
||||
github.com/jinzhu/now v1.1.5 h1:/o9tlHleP7gOFmsnYNz3RGnqzefHA47wQpKrrdTIwXQ=
|
||||
github.com/jinzhu/now v1.1.5/go.mod h1:d3SSVoowX0Lcu0IBviAWJpolVfI5UJVZZ7cO71lE/z8=
|
||||
github.com/mattn/go-sqlite3 v1.14.34 h1:3NtcvcUnFBPsuRcno8pUtupspG/GM+9nZ88zgJcp6Zk=
|
||||
github.com/mattn/go-sqlite3 v1.14.34/go.mod h1:Uh1q+B4BYcTPb+yiD3kU8Ct7aC0hY9fxUwlHK0RXw+Y=
|
||||
golang.org/x/text v0.35.0 h1:JOVx6vVDFokkpaq1AEptVzLTpDe9KGpj5tR4/X+ybL8=
|
||||
golang.org/x/text v0.35.0/go.mod h1:khi/HExzZJ2pGnjenulevKNX1W67CUy0AsXcNubPGCA=
|
||||
gorm.io/driver/sqlite v1.6.0 h1:WHRRrIiulaPiPFmDcod6prc4l2VGVWHz80KspNsxSfQ=
|
||||
gorm.io/driver/sqlite v1.6.0/go.mod h1:AO9V1qIQddBESngQUKWL9yoH93HIeA1X6V633rBwyT8=
|
||||
gorm.io/gorm v1.31.1 h1:7CA8FTFz/gRfgqgpeKIBcervUn3xSyPUmr6B2WXJ7kg=
|
||||
gorm.io/gorm v1.31.1/go.mod h1:XyQVbO2k6YkOis7C2437jSit3SsDK72s7n7rsSHd+Gs=
|
||||
39
main.go
Normal file
39
main.go
Normal file
@@ -0,0 +1,39 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
"net/http"
|
||||
"os"
|
||||
"url-short/models"
|
||||
"url-short/routes"
|
||||
|
||||
"gorm.io/driver/sqlite"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
func main() {
|
||||
fmt.Println("Iniciando url-short")
|
||||
|
||||
db, err := gorm.Open(sqlite.Open("shorturls.db"), &gorm.Config{})
|
||||
if err != nil {
|
||||
panic("failed to connect database")
|
||||
}
|
||||
|
||||
fmt.Println("Se conecto a la base de datos")
|
||||
|
||||
db.AutoMigrate(&models.Url{})
|
||||
|
||||
http.HandleFunc("/url", func(w http.ResponseWriter, r *http.Request){
|
||||
routes.Url(w, r, db)
|
||||
})
|
||||
|
||||
port := ":8080"
|
||||
if envPort := os.Getenv("PORT"); envPort != "" {
|
||||
port = ":" + envPort
|
||||
}
|
||||
fmt.Println("Servidor escuchando en puerto: http://localhost"+ port)
|
||||
err = http.ListenAndServe(port, nil)
|
||||
if err != nil {
|
||||
panic("Error starting server: " + err.Error())
|
||||
}
|
||||
}
|
||||
10
models/url.go
Normal file
10
models/url.go
Normal file
@@ -0,0 +1,10 @@
|
||||
package models
|
||||
|
||||
import "time"
|
||||
|
||||
type Url struct {
|
||||
Shorturl string `gorm:"primaryKey"`
|
||||
// Id uint64 `gorm: "primaryKey;autoIncrement"`
|
||||
Longurl string `gorm:"uniqueIndex:idx_lurl"`
|
||||
Time time.Time `gorm:"autoCreateTime"`
|
||||
}
|
||||
3
readme.md
Normal file
3
readme.md
Normal file
@@ -0,0 +1,3 @@
|
||||
# Config
|
||||
si se necesita especificar un puerto use la variable de entorno `PORT`
|
||||
Ej, `PORT=8081 ./url-short`
|
||||
47
repository/CrearUrl.go
Normal file
47
repository/CrearUrl.go
Normal file
@@ -0,0 +1,47 @@
|
||||
package repository
|
||||
|
||||
import (
|
||||
"crypto/sha3"
|
||||
"fmt"
|
||||
"url-short/models"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
func CrearUrl(longURL string, db *gorm.DB) (string, error) {
|
||||
// checkeamos por longurl repetida
|
||||
counturl := int64(0)
|
||||
result := db.Model(&models.Url{}).Where("longurl = ?", longURL).Count(&counturl)
|
||||
if result.Error != nil {
|
||||
return "", result.Error
|
||||
}
|
||||
if counturl != 0 {
|
||||
println(1)
|
||||
var short models.Url
|
||||
result = db.Model(&short).Where("longurl = ?", longURL).Select("shorturl").First(&short)
|
||||
if result.Error != nil {
|
||||
return "", result.Error
|
||||
}
|
||||
return short.Shorturl, nil
|
||||
}
|
||||
|
||||
// shortURL := base64.StdEncoding.EncodeToString([]byte(longURL))[:10]
|
||||
sha := sha3.New224()
|
||||
sha.Write([]byte(longURL))
|
||||
shortURL := fmt.Sprintf("%x", sha.Sum(nil))[:10]
|
||||
|
||||
result = db.Model(&models.Url{}).Where("shorturl = ?", shortURL).Count(&counturl)
|
||||
if result.Error != nil {
|
||||
return "", result.Error
|
||||
}
|
||||
if counturl != 0 {
|
||||
return shortURL, nil
|
||||
}
|
||||
|
||||
result = db.Create(&models.Url{Longurl: longURL, Shorturl: shortURL})
|
||||
|
||||
if result.Error != nil {
|
||||
return "", result.Error
|
||||
}
|
||||
return shortURL, nil
|
||||
}
|
||||
33
routes/url.go
Normal file
33
routes/url.go
Normal file
@@ -0,0 +1,33 @@
|
||||
package routes
|
||||
|
||||
import (
|
||||
"encoding/json"
|
||||
"net/http"
|
||||
"url-short/dto"
|
||||
"url-short/repository"
|
||||
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
func Url(w http.ResponseWriter, r *http.Request, db *gorm.DB) {
|
||||
if r.Method == http.MethodPost {
|
||||
var reqBody dto.ReqBody
|
||||
|
||||
err := json.NewDecoder(r.Body).Decode(&reqBody)
|
||||
if err != nil {
|
||||
http.Error(w, "Error: ", http.StatusBadRequest)
|
||||
return
|
||||
}
|
||||
|
||||
shortUrl, err := repository.CrearUrl(reqBody.LongUrl, db)
|
||||
if err != nil {
|
||||
http.Error(w, "Error: "+err.Error(), http.StatusBadRequest)
|
||||
}
|
||||
w.Header().Set("Content-Type", "application/json")
|
||||
json.NewEncoder(w).Encode(map[string]string{
|
||||
"shortUrl": shortUrl,
|
||||
})
|
||||
}else{
|
||||
http.Error(w, "404", http.StatusBadGateway);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user