|
|
|
|
|
by EgeAytin
655 days ago
|
|
In a standard relational based databases, the suggested place to write relationships to Permify is sending the write request in database transaction of the client action: such as assigning the user as owner. If the transaction fails, you should delete the malformed relation tuple from Permify to maintain consistency. Here's an example of how this might look in code: ``` func CreateDocuments(db *gorm.DB) error { tx := db.Begin()
defer func() {
if r := recover(); r != nil {
tx.Rollback()
// if transaction fails, then delete malformed relation tuple
permify.DeleteData(...)
}
}()
if err := tx.Error; err != nil {
return err
}
if err := tx.Create(docs).Error; err != nil {
tx.Rollback()
// if transaction fails, then delete malformed relation tuple
permify.DeleteData(...)
return err
}
// if transaction successful, write relation tuple to Permify
permify.WriteData(...)
return tx.Commit().Error
}``` Although this is an anti-pattern, this approach ensures that if the transaction in the application database fails and is rolled back, the corresponding data in Permify is also deleted, preventing inconsistencies. |
|
If yes, then this is quite a burden and might be a valid reason for not using a separate permissions store. But maybe there are better ways...?