Email is unique for people + start work on authelia integration

This commit is contained in:
William Bouzourène 2026-03-13 14:42:40 +01:00
parent 76981f31c8
commit aeb43e4775
Signed by: bouzoure
GPG key ID: 423440D735B56BE2
9 changed files with 82 additions and 4 deletions

View file

@ -5,3 +5,4 @@ APP_LISTEN_PORT=3000
APP_BEHIND_PROXY=false APP_BEHIND_PROXY=false
DATABASE_DSN="host=localhost user=camarades password=camarades dbname=camarades port=5432 sslmode=disable TimeZone=Europe/Zurich" DATABASE_DSN="host=localhost user=camarades password=camarades dbname=camarades port=5432 sslmode=disable TimeZone=Europe/Zurich"
SESSIONS_LOCATION=./sessions.db SESSIONS_LOCATION=./sessions.db
AUTHELIA_USERS_LOCATION=./users.yml

1
.gitignore vendored
View file

@ -6,3 +6,4 @@ static/assets
pop-camarades pop-camarades
*.db *.db
__debug_bin* __debug_bin*
users.yml

View file

@ -495,6 +495,18 @@ func ContactAdd(c *fiber.Ctx) error {
person.PostalCode = data.PostalCode person.PostalCode = data.PostalCode
person.City = data.City person.City = data.City
if len(data.Email) > 0 {
var personEmail []models.Person
result := db.Find(&personEmail, "LOWER(email) = LOWER(?)", data.Email)
if result.Error != nil {
return result.Error
}
if result.RowsAffected > 0 {
errors = append(errors, "L'adresse email est déjà utilisée par un membre ou un sympathisant")
}
}
sectionID, err := strconv.ParseUint(data.Section, 10, 0) sectionID, err := strconv.ParseUint(data.Section, 10, 0)
if err == nil { if err == nil {
for _, section := range sections { for _, section := range sections {
@ -744,6 +756,18 @@ func ContactEdit(c *fiber.Ctx) error {
person.PostalCode = data.PostalCode person.PostalCode = data.PostalCode
person.City = data.City person.City = data.City
if len(data.Email) > 0 {
var personEmail []models.Person
result := db.Find(&personEmail, "LOWER(email) = LOWER(?)", data.Email)
if result.Error != nil {
return result.Error
}
if result.RowsAffected > 0 {
errors = append(errors, "L'adresse email est déjà utilisée par un membre ou un sympathisant")
}
}
sectionID, err := strconv.ParseUint(data.Section, 10, 0) sectionID, err := strconv.ParseUint(data.Section, 10, 0)
if err == nil { if err == nil {
for _, section := range sections { for _, section := range sections {

View file

@ -18,7 +18,7 @@ import (
type PersonValidation struct { type PersonValidation struct {
LastName string `validate:"max=100"` LastName string `validate:"max=100"`
FirstName string `validate:"required,min=1,max=100"` FirstName string `validate:"required,min=1,max=100"`
Email string `validate:"max=100"` Email string `validate:"max=100,email"`
Phone string `validate:"max=100"` Phone string `validate:"max=100"`
Mobile string `validate:"max=100"` Mobile string `validate:"max=100"`
Address1 string `validate:"max=100"` Address1 string `validate:"max=100"`
@ -498,6 +498,18 @@ func MemberAdd(c *fiber.Ctx) error {
} }
} }
if len(data.Email) > 0 {
var personEmail []models.Person
result := db.Find(&personEmail, "LOWER(email) = LOWER(?)", data.Email)
if result.Error != nil {
return result.Error
}
if result.RowsAffected > 0 {
errors = append(errors, "L'adresse email est déjà utilisée par un membre ou un sympathisant")
}
}
person.IsContact = false person.IsContact = false
person.IsMember = true person.IsMember = true
person.LastName = data.LastName person.LastName = data.LastName
@ -747,6 +759,18 @@ func MemberEdit(c *fiber.Ctx) error {
} }
} }
if len(data.Email) > 0 {
var personEmail []models.Person
result := db.Find(&personEmail, "LOWER(email) = LOWER(?)", data.Email)
if result.Error != nil {
return result.Error
}
if result.RowsAffected > 0 {
errors = append(errors, "L'adresse email est déjà utilisée par un membre ou un sympathisant")
}
}
person.IsContact = false person.IsContact = false
person.IsMember = true person.IsMember = true
person.LastName = data.LastName person.LastName = data.LastName

View file

@ -0,0 +1 @@
package authelia

View file

@ -20,6 +20,9 @@ type Config struct {
Sessions struct { Sessions struct {
Location string `env:"SESSIONS_LOCATION"` Location string `env:"SESSIONS_LOCATION"`
} }
Authelia struct {
UsersLocation string `env:"AUTHELIA_USERS_LOCATION"`
}
} }
var configParsed bool var configParsed bool

View file

@ -52,6 +52,7 @@ func GetDatabase() (*gorm.DB, error) {
&models.Role{}, &models.Role{},
&models.UserRole{}, &models.UserRole{},
&models.Person{}, &models.Person{},
&models.PersonAccount{},
&models.List{}, &models.List{},
&models.ListItem{}, &models.ListItem{},
&models.Field{}, &models.Field{},

View file

@ -1,6 +1,11 @@
package models package models
import "gorm.io/gorm" import (
"time"
"github.com/google/uuid"
"gorm.io/gorm"
)
type Person struct { type Person struct {
gorm.Model gorm.Model
@ -8,7 +13,7 @@ type Person struct {
IsContact bool IsContact bool
FirstName string FirstName string
LastName string LastName string
Email string Email string `gorm:"unique"`
Phone string Phone string
Mobile string Mobile string
Address1 string Address1 string
@ -18,3 +23,21 @@ type Person struct {
SectionID uint SectionID uint
Section Section Section Section
} }
type PersonAccount struct {
gorm.Model
PersonID uint
Person Person
UUID uuid.UUID `gorm:"unique"`
Enabled bool
Email string `gorm:"unique"`
GivenName string
FamilyName string
DisplayName string
Groups string
InitialPassword string
InvitationSent time.Time
AccountReady bool
AccountCreated bool
UpdateNeeded bool
}

View file

@ -10,7 +10,7 @@ import (
type User struct { type User struct {
gorm.Model gorm.Model
Name string Name string
Email string Email string `gorm:"unique"`
Password string Password string
TotpSecret sql.NullString TotpSecret sql.NullString
IsAdmin bool IsAdmin bool