1
0
mirror of https://github.com/aclindsa/moneygo.git synced 2024-11-01 00:10:06 -04:00
moneygo/internal/handlers/accounts.go

251 lines
6.3 KiB
Go
Raw Normal View History

package handlers
2015-06-25 22:36:58 -04:00
2015-06-27 17:46:06 -04:00
import (
"errors"
2017-12-03 06:38:22 -05:00
"github.com/aclindsa/moneygo/internal/models"
2017-12-07 20:47:55 -05:00
"github.com/aclindsa/moneygo/internal/store"
2015-06-27 17:46:06 -04:00
"log"
"net/http"
)
// Get (and attempt to create if it doesn't exist). Matches on UserId,
// SecurityId, Type, Name, and ParentAccountId
2017-12-09 05:56:45 -05:00
func GetCreateAccount(tx store.Tx, a models.Account) (*models.Account, error) {
var account models.Account
2017-12-07 20:47:55 -05:00
accounts, err := tx.FindMatchingAccounts(&a)
if err != nil {
return nil, err
}
2017-12-07 20:47:55 -05:00
if len(*accounts) > 0 {
account = *(*accounts)[0]
} else {
account.UserId = a.UserId
account.SecurityId = a.SecurityId
account.Type = a.Type
account.Name = a.Name
account.ParentAccountId = a.ParentAccountId
2017-12-09 05:56:45 -05:00
err = tx.InsertAccount(&account)
if err != nil {
return nil, err
}
}
return &account, nil
}
// Get (and attempt to create if it doesn't exist) the security/currency
// trading account for the supplied security/currency
2017-12-09 05:56:45 -05:00
func GetTradingAccount(tx store.Tx, userid int64, securityid int64) (*models.Account, error) {
var tradingAccount models.Account
var account models.Account
2017-12-07 20:08:43 -05:00
user, err := tx.GetUser(userid)
if err != nil {
return nil, err
}
tradingAccount.UserId = userid
tradingAccount.Type = models.Trading
tradingAccount.Name = "Trading"
tradingAccount.SecurityId = user.DefaultCurrency
tradingAccount.ParentAccountId = -1
// Find/create the top-level trading account
ta, err := GetCreateAccount(tx, tradingAccount)
if err != nil {
return nil, err
}
2017-12-07 20:08:43 -05:00
security, err := tx.GetSecurity(securityid, userid)
if err != nil {
return nil, err
}
account.UserId = userid
account.Name = security.Name
account.ParentAccountId = ta.AccountId
account.SecurityId = securityid
account.Type = models.Trading
a, err := GetCreateAccount(tx, account)
if err != nil {
return nil, err
}
return a, nil
}
// Get (and attempt to create if it doesn't exist) the security/currency
// imbalance account for the supplied security/currency
2017-12-09 05:56:45 -05:00
func GetImbalanceAccount(tx store.Tx, userid int64, securityid int64) (*models.Account, error) {
var imbalanceAccount models.Account
var account models.Account
2017-12-03 06:38:22 -05:00
xxxtemplate := FindSecurityTemplate("XXX", models.Currency)
2017-06-04 16:01:42 -04:00
if xxxtemplate == nil {
return nil, errors.New("Couldn't find XXX security template")
}
xxxsecurity, err := ImportGetCreateSecurity(tx, userid, xxxtemplate)
2017-06-04 16:01:42 -04:00
if err != nil {
return nil, errors.New("Couldn't create XXX security")
}
imbalanceAccount.UserId = userid
imbalanceAccount.Name = "Imbalances"
imbalanceAccount.ParentAccountId = -1
2017-06-04 16:01:42 -04:00
imbalanceAccount.SecurityId = xxxsecurity.SecurityId
imbalanceAccount.Type = models.Bank
// Find/create the top-level trading account
ia, err := GetCreateAccount(tx, imbalanceAccount)
if err != nil {
return nil, err
}
2017-12-07 20:08:43 -05:00
security, err := tx.GetSecurity(securityid, userid)
if err != nil {
return nil, err
}
account.UserId = userid
account.Name = security.Name
account.ParentAccountId = ia.AccountId
account.SecurityId = securityid
account.Type = models.Bank
a, err := GetCreateAccount(tx, account)
if err != nil {
return nil, err
}
return a, nil
}
func AccountHandler(r *http.Request, context *Context) ResponseWriterWriter {
user, err := GetUserFromSession(context.Tx, r)
2015-06-27 17:46:06 -04:00
if err != nil {
return NewError(1 /*Not Signed In*/)
2015-06-27 17:46:06 -04:00
}
if r.Method == "POST" {
if !context.LastLevel() {
accountid, err := context.NextID()
if err != nil || context.NextLevel() != "imports" {
return NewError(3 /*Invalid Request*/)
}
return AccountImportHandler(context, r, user, accountid)
}
var account models.Account
if err := ReadJSON(r, &account); err != nil {
return NewError(3 /*Invalid Request*/)
2015-06-27 17:46:06 -04:00
}
account.AccountId = -1
account.UserId = user.UserId
2015-08-05 21:25:25 -04:00
account.AccountVersion = 0
2015-06-27 17:46:06 -04:00
2017-12-07 20:08:43 -05:00
security, err := context.Tx.GetSecurity(account.SecurityId, user.UserId)
if err != nil {
log.Print(err)
return NewError(999 /*Internal Error*/)
}
if security == nil {
return NewError(3 /*Invalid Request*/)
2015-06-27 17:46:06 -04:00
}
2017-12-07 20:47:55 -05:00
err = context.Tx.InsertAccount(&account)
2015-06-27 17:46:06 -04:00
if err != nil {
2017-12-07 20:47:55 -05:00
if _, ok := err.(store.ParentAccountMissingError); ok {
return NewError(3 /*Invalid Request*/)
2015-06-27 17:46:06 -04:00
} else {
log.Print(err)
return NewError(999 /*Internal Error*/)
2015-06-27 17:46:06 -04:00
}
}
return ResponseWrapper{201, &account}
2015-06-27 17:46:06 -04:00
} else if r.Method == "GET" {
if context.LastLevel() {
2015-06-27 17:46:06 -04:00
//Return all Accounts
var al models.AccountList
2017-12-07 20:47:55 -05:00
accounts, err := context.Tx.GetAccounts(user.UserId)
2015-06-27 17:46:06 -04:00
if err != nil {
log.Print(err)
return NewError(999 /*Internal Error*/)
2015-06-27 17:46:06 -04:00
}
al.Accounts = accounts
return &al
}
accountid, err := context.NextID()
if err != nil {
return NewError(3 /*Invalid Request*/)
}
if context.LastLevel() {
// Return Account with this Id
2017-12-07 20:47:55 -05:00
account, err := context.Tx.GetAccount(accountid, user.UserId)
2015-06-27 17:46:06 -04:00
if err != nil {
return NewError(3 /*Invalid Request*/)
2015-06-27 17:46:06 -04:00
}
return account
} else if context.NextLevel() == "transactions" {
return AccountTransactionsHandler(context, r, user, accountid)
2015-06-27 17:46:06 -04:00
}
} else {
accountid, err := context.NextID()
2015-06-27 17:46:06 -04:00
if err != nil {
return NewError(3 /*Invalid Request*/)
2015-06-27 17:46:06 -04:00
}
if r.Method == "PUT" {
var account models.Account
if err := ReadJSON(r, &account); err != nil || account.AccountId != accountid {
return NewError(3 /*Invalid Request*/)
2015-06-27 17:46:06 -04:00
}
account.UserId = user.UserId
2017-12-07 20:08:43 -05:00
security, err := context.Tx.GetSecurity(account.SecurityId, user.UserId)
if err != nil {
log.Print(err)
return NewError(999 /*Internal Error*/)
}
if security == nil {
return NewError(3 /*Invalid Request*/)
2015-06-27 17:46:06 -04:00
}
2017-10-11 21:19:14 -04:00
if account.ParentAccountId == account.AccountId {
return NewError(3 /*Invalid Request*/)
2017-10-11 21:19:14 -04:00
}
2017-12-07 20:47:55 -05:00
err = context.Tx.UpdateAccount(&account)
2015-06-27 17:46:06 -04:00
if err != nil {
2017-12-07 20:47:55 -05:00
if _, ok := err.(store.ParentAccountMissingError); ok {
return NewError(3 /*Invalid Request*/)
2017-12-07 20:47:55 -05:00
} else if _, ok := err.(store.CircularAccountsError); ok {
return NewError(3 /*Invalid Request*/)
2017-10-11 21:19:14 -04:00
} else {
log.Print(err)
return NewError(999 /*Internal Error*/)
2017-10-11 21:19:14 -04:00
}
2015-06-27 17:46:06 -04:00
}
return &account
2015-06-27 17:46:06 -04:00
} else if r.Method == "DELETE" {
2017-12-07 20:47:55 -05:00
account, err := context.Tx.GetAccount(accountid, user.UserId)
2015-06-27 17:46:06 -04:00
if err != nil {
return NewError(3 /*Invalid Request*/)
2015-06-27 17:46:06 -04:00
}
2017-12-07 20:47:55 -05:00
err = context.Tx.DeleteAccount(account)
if err != nil {
2015-06-27 17:46:06 -04:00
log.Print(err)
return NewError(999 /*Internal Error*/)
2015-06-27 17:46:06 -04:00
}
return SuccessWriter{}
2015-06-27 17:46:06 -04:00
}
}
return NewError(3 /*Invalid Request*/)
2015-06-25 22:36:58 -04:00
}