CreateLedger inserts a new ledger record into the database, ensuring metadata is properly marshaled into JSON format. It assigns a unique ledger ID with a suffix and captures the current timestamp as the creation time. Parameters: - ledger: The ledger data to be inserted into the database. Returns
(ledger model.Ledger)
| 39 | // - model.Ledger: The created ledger object including the generated LedgerID and creation timestamp. |
| 40 | // - error: An error if the ledger creation fails, including specific database error handling for conflicts. |
| 41 | func (d Datasource) CreateLedger(ledger model.Ledger) (model.Ledger, error) { |
| 42 | // Marshal the metadata into JSON format |
| 43 | metaDataJSON, err := json.Marshal(ledger.MetaData) |
| 44 | if err != nil { |
| 45 | return model.Ledger{}, apierror.NewAPIError(apierror.ErrInternalServer, "Failed to marshal metadata", err) |
| 46 | } |
| 47 | |
| 48 | // Assign a unique ledger ID and record the creation time |
| 49 | ledger.LedgerID = model.GenerateUUIDWithSuffix("ldg") |
| 50 | ledger.CreatedAt = time.Now() |
| 51 | |
| 52 | // Insert the ledger into the database |
| 53 | _, err = d.Conn.ExecContext(context.Background(), ` |
| 54 | INSERT INTO ledgerforge.ledgers (meta_data, name, ledger_id) |
| 55 | VALUES ($1, $2, $3) |
| 56 | `, metaDataJSON, ledger.Name, ledger.LedgerID) |
| 57 | // Handle database errors, specifically unique constraint violations |
| 58 | if err != nil { |
| 59 | pqErr, ok := err.(*pq.Error) |
| 60 | if ok { |
| 61 | switch pqErr.Code.Name() { |
| 62 | case "unique_violation": |
| 63 | return model.Ledger{}, apierror.NewAPIError(apierror.ErrConflict, "Ledger with this name or ID already exists", err) |
| 64 | default: |
| 65 | return model.Ledger{}, apierror.NewAPIError(apierror.ErrInternalServer, "Database error occurred", err) |
| 66 | } |
| 67 | } |
| 68 | return model.Ledger{}, apierror.NewAPIError(apierror.ErrInternalServer, "Failed to create ledger", err) |
| 69 | } |
| 70 | |
| 71 | return ledger, nil |
| 72 | } |
| 73 | |
| 74 | // GetAllLedgers retrieves a paginated list of ledger records from the database, unmarshaling their metadata from JSON format. |
| 75 | // This method supports pagination and can be used to efficiently retrieve all ledgers over multiple requests. |