Email is unique for people + start work on authelia integration
This commit is contained in:
parent
76981f31c8
commit
aeb43e4775
9 changed files with 82 additions and 4 deletions
|
|
@ -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
1
.gitignore
vendored
|
|
@ -6,3 +6,4 @@ static/assets
|
||||||
pop-camarades
|
pop-camarades
|
||||||
*.db
|
*.db
|
||||||
__debug_bin*
|
__debug_bin*
|
||||||
|
users.yml
|
||||||
|
|
@ -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 {
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
1
helpers/authelia/users.go
Normal file
1
helpers/authelia/users.go
Normal file
|
|
@ -0,0 +1 @@
|
||||||
|
package authelia
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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{},
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue