Added user authentication
This commit is contained in:
parent
d7e7af5a10
commit
cb54057305
40 changed files with 710 additions and 218 deletions
|
|
@ -40,6 +40,19 @@ func (s *Service) GetPost(ctx context.Context, id int) (models.Post, error) {
|
|||
return post, nil
|
||||
}
|
||||
|
||||
func (s *Service) DeletePost(ctx context.Context, site models.Site, id int) error {
|
||||
post, err := s.db.GetPost(ctx, int64(id))
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if err := s.db.DeletePost(ctx, int64(id)); err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return s.jobs.Queue(ctx, s.sb.DeletePost(site, post))
|
||||
}
|
||||
|
||||
func (s *Service) Create(ctx context.Context, site models.Site, req NewPost) (models.Post, error) {
|
||||
post := models.Post{
|
||||
SiteID: site.ID,
|
||||
|
|
|
|||
|
|
@ -47,13 +47,41 @@ func (s *Service) WriteAllPosts(site models.Site) models.Job {
|
|||
}
|
||||
}
|
||||
|
||||
func (s *Service) DeletePost(site models.Site, post models.Post) models.Job {
|
||||
return models.Jobs(
|
||||
models.Job{
|
||||
Do: func(ctx context.Context) error {
|
||||
themeMeta, ok := s.themes.Lookup(site.Theme)
|
||||
if !ok {
|
||||
return errors.New("theme not found")
|
||||
}
|
||||
|
||||
postFilename := s.postFilename(site, themeMeta, post)
|
||||
|
||||
if _, err := os.Stat(postFilename); err != nil {
|
||||
if errors.Is(err, os.ErrNotExist) {
|
||||
return nil
|
||||
}
|
||||
return err
|
||||
}
|
||||
|
||||
if os.Remove(postFilename) != nil {
|
||||
return nil
|
||||
}
|
||||
return nil
|
||||
},
|
||||
},
|
||||
s.Publish(site),
|
||||
)
|
||||
}
|
||||
|
||||
func (s *Service) writePost(site models.Site, post models.Post) error {
|
||||
themeMeta, ok := s.themes.Lookup(site.Theme)
|
||||
if !ok {
|
||||
return errors.New("theme not found")
|
||||
}
|
||||
|
||||
postFilename := filepath.Join(s.hugo.SiteStagingDir(site, hugo.ContentSiteDir), themeMeta.PostDir, post.CreatedAt.Format("2006-01-02-150405.md"))
|
||||
postFilename := s.postFilename(site, themeMeta, post)
|
||||
|
||||
log.Printf(" .. post %v", postFilename)
|
||||
|
||||
|
|
@ -96,3 +124,7 @@ func (s *Service) writePost(site models.Site, post models.Post) error {
|
|||
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *Service) postFilename(site models.Site, themeMeta models.ThemeMeta, post models.Post) string {
|
||||
return filepath.Join(s.hugo.SiteStagingDir(site, hugo.ContentSiteDir), themeMeta.PostDir, post.CreatedAt.Format("2006-01-02-150405.md"))
|
||||
}
|
||||
|
|
|
|||
|
|
@ -41,11 +41,13 @@ func (s *Service) GetSite(ctx context.Context, id int) (models.Site, error) {
|
|||
return s.db.GetSite(ctx, int64(id))
|
||||
}
|
||||
|
||||
func (s *Service) CreateSite(ctx context.Context, name string) (models.Site, error) {
|
||||
func (s *Service) CreateSite(ctx context.Context, user models.User, name string) (models.Site, error) {
|
||||
newSite := models.Site{
|
||||
Name: normaliseName(name),
|
||||
Title: name,
|
||||
Theme: "bear",
|
||||
Name: normaliseName(name),
|
||||
OwnerUserID: user.ID,
|
||||
Title: name,
|
||||
Theme: "bear",
|
||||
URL: "https://meek-meringue-060cfc.netlify.app/",
|
||||
}
|
||||
|
||||
_, ok := s.themes.Lookup(newSite.Theme)
|
||||
|
|
@ -62,7 +64,7 @@ func (s *Service) CreateSite(ctx context.Context, name string) (models.Site, err
|
|||
SiteID: newSite.ID,
|
||||
Role: models.TargetRoleProduction,
|
||||
Type: models.TargetTypeNetlify,
|
||||
URL: "https://meek-meringue-060cfc.netlify.app",
|
||||
URL: "https://meek-meringue-060cfc.netlify.app/",
|
||||
TargetRef: "e628dc6e-e6e1-45a9-847a-982adef940a8",
|
||||
}); err != nil {
|
||||
return models.Site{}, err
|
||||
|
|
|
|||
76
services/users/service.go
Normal file
76
services/users/service.go
Normal file
|
|
@ -0,0 +1,76 @@
|
|||
package users
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/base64"
|
||||
"golang.org/x/crypto/bcrypt"
|
||||
"lmika.dev/lmika/hugo-cms/models"
|
||||
"lmika.dev/lmika/hugo-cms/providers/db"
|
||||
"log"
|
||||
)
|
||||
|
||||
type Service struct {
|
||||
dbp *db.DB
|
||||
}
|
||||
|
||||
func NewService(dbp *db.DB) *Service {
|
||||
return &Service{
|
||||
dbp: dbp,
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Service) AddUser(ctx context.Context, newUser NewUser) (models.User, error) {
|
||||
passwd, err := bcrypt.GenerateFromPassword([]byte(newUser.Password), bcrypt.DefaultCost)
|
||||
if err != nil {
|
||||
return models.User{}, err
|
||||
}
|
||||
|
||||
user := models.User{
|
||||
Email: newUser.Email,
|
||||
PasswordHash: base64.StdEncoding.EncodeToString(passwd),
|
||||
}
|
||||
if err := s.dbp.AddUser(ctx, &user); err != nil {
|
||||
return models.User{}, err
|
||||
}
|
||||
|
||||
return user, nil
|
||||
}
|
||||
|
||||
func (s *Service) GetUserByID(ctx context.Context, id int64) (models.User, error) {
|
||||
return s.dbp.GetUserByID(ctx, id)
|
||||
}
|
||||
|
||||
func (s *Service) VerifyLogin(ctx context.Context, email string, password string) (models.User, error) {
|
||||
user, err := s.dbp.GetUserByEmail(ctx, email)
|
||||
if err != nil {
|
||||
log.Println("User not found")
|
||||
return models.User{}, err
|
||||
}
|
||||
|
||||
pwdHash, err := base64.StdEncoding.DecodeString(user.PasswordHash)
|
||||
if err != nil {
|
||||
return models.User{}, err
|
||||
}
|
||||
|
||||
err = bcrypt.CompareHashAndPassword(pwdHash, []byte(password))
|
||||
if err != nil {
|
||||
log.Println("Password incorrect")
|
||||
return models.User{}, err
|
||||
}
|
||||
|
||||
return user, nil
|
||||
}
|
||||
|
||||
func (s *Service) GetUserByEmail(ctx context.Context, email string) (models.User, error) {
|
||||
user, err := s.dbp.GetUserByEmail(ctx, email)
|
||||
if err != nil {
|
||||
return models.User{}, err
|
||||
}
|
||||
|
||||
return user, nil
|
||||
}
|
||||
|
||||
type NewUser struct {
|
||||
Email string `json:"email"`
|
||||
Password string `json:"password"`
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue