Added user authentication

This commit is contained in:
Leon Mika 2025-02-01 09:42:32 +11:00
parent d7e7af5a10
commit cb54057305
40 changed files with 710 additions and 218 deletions

View file

@ -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,

View file

@ -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"))
}

View file

@ -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
View 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"`
}