Implement event interfaces on your entities to receive callbacks:
typeUserstruct{dynorm.EntityEmailstring}// Called before savingfunc(u*User)Creating()error{// Validate, transform, or rejectreturnnil}// Called after savingfunc(u*User)Created(){// Post-creation logic}
typeUserstruct{dynorm.EntityEmailstringUpdatedBystring}func(u*User)Saving()error{// Set audit fieldu.UpdatedBy=getCurrentUserID()returnnil}func(u*User)Saved(){// Log the savelog.Printf("User %s saved by %s",u.ID,u.UpdatedBy)}
typeUserstruct{dynorm.EntityEmailstringUsernamestring}func(u*User)Creating()error{// Normalize emailu.Email=strings.ToLower(strings.TrimSpace(u.Email))// Generate username if not providedifu.Username==""{u.Username=strings.Split(u.Email,"@")[0]}returnnil}
typeUserstruct{dynorm.EntityEmailstringUsernamestringAgeint}func(u*User)Creating()error{ifu.Age<13{returnerrors.New("user must be at least 13 years old")}returnnil}func(u*User)Updating()error{// Prevent email changesifu.IsDirty("Email"){returnerrors.New("email cannot be changed")}returnnil}
typeUserstruct{dynorm.EntityEmailstring}func(u*User)Deleting()error{// Delete related entitiesposts,_:=PostRepo.Where("AuthorID","=",u.ID).GetAll()for_,post:=rangeposts.Items(){iferr:=PostRepo.Delete(post);err!=nil{returnerr}}returnnil}
typeOrderstruct{dynorm.EntityCustomerEmailstringStatusstring}func(o*Order)Created(){// Send confirmation emailgosendEmail(o.CustomerEmail,"Order Confirmed",o.ID)}func(o*Order)Updated(){ifo.IsDirty("Status"){// Send status updategosendEmail(o.CustomerEmail,"Order Status Updated",o.Status)}}