60 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
		
		
			
		
	
	
			60 lines
		
	
	
		
			1.5 KiB
		
	
	
	
		
			Go
		
	
	
	
|  | package core | ||
|  | 
 | ||
|  | // Model defines an interface with common methods that all db models should have.
 | ||
|  | //
 | ||
|  | // Note: for simplicity composite pk are not supported.
 | ||
|  | type Model interface { | ||
|  | 	TableName() string | ||
|  | 	PK() any | ||
|  | 	LastSavedPK() any | ||
|  | 	IsNew() bool | ||
|  | 	MarkAsNew() | ||
|  | 	MarkAsNotNew() | ||
|  | } | ||
|  | 
 | ||
|  | // BaseModel defines a base struct that is intended to be embedded into other custom models.
 | ||
|  | type BaseModel struct { | ||
|  | 	lastSavedPK string | ||
|  | 
 | ||
|  | 	// Id is the primary key of the model.
 | ||
|  | 	// It is usually autogenerated by the parent model implementation.
 | ||
|  | 	Id string `db:"id" json:"id" form:"id" xml:"id"` | ||
|  | } | ||
|  | 
 | ||
|  | // LastSavedPK returns the last saved primary key of the model.
 | ||
|  | //
 | ||
|  | // Its value is updated to the latest PK value after MarkAsNotNew() or PostScan() calls.
 | ||
|  | func (m *BaseModel) LastSavedPK() any { | ||
|  | 	return m.lastSavedPK | ||
|  | } | ||
|  | 
 | ||
|  | func (m *BaseModel) PK() any { | ||
|  | 	return m.Id | ||
|  | } | ||
|  | 
 | ||
|  | // IsNew indicates what type of db query (insert or update)
 | ||
|  | // should be used with the model instance.
 | ||
|  | func (m *BaseModel) IsNew() bool { | ||
|  | 	return m.lastSavedPK == "" | ||
|  | } | ||
|  | 
 | ||
|  | // MarkAsNew clears the pk field and marks the current model as "new"
 | ||
|  | // (aka. forces m.IsNew() to be true).
 | ||
|  | func (m *BaseModel) MarkAsNew() { | ||
|  | 	m.lastSavedPK = "" | ||
|  | } | ||
|  | 
 | ||
|  | // MarkAsNew set the pk field to the Id value and marks the current model
 | ||
|  | // as NOT "new" (aka. forces m.IsNew() to be false).
 | ||
|  | func (m *BaseModel) MarkAsNotNew() { | ||
|  | 	m.lastSavedPK = m.Id | ||
|  | } | ||
|  | 
 | ||
|  | // PostScan implements the [dbx.PostScanner] interface.
 | ||
|  | //
 | ||
|  | // It is usually executed right after the model is populated with the db row values.
 | ||
|  | func (m *BaseModel) PostScan() error { | ||
|  | 	m.MarkAsNotNew() | ||
|  | 	return nil | ||
|  | } |