feat: Implement BudgetClient, add method for syncing bank

This commit is contained in:
TheWanderingCrow 2025-11-11 10:40:07 -05:00
parent 5f7ea4ccca
commit 79a6c7a2c1
7 changed files with 66 additions and 1 deletions

3
.env.example Normal file
View file

@ -0,0 +1,3 @@
BASE_URL=
API_KEY=
SYNC_ID=

1
.gitignore vendored
View file

@ -1,2 +1,3 @@
.direnv/
result
.env

View file

@ -2,7 +2,7 @@ Learning golang, writing a simple app to interface with an HTTP API and generate
# TODO
- [ ] Fetch the desired budget file
- [ ] Trigger a bank sync and see if we can wait for it to finish (might need to trigger the sync and then just wait, could also just do daily bank syncs at a certain hour)
- [x] Trigger a bank sync and see if we can wait for it to finish (looks like it's a blocking call so we can safely sync before reports)
- [ ] Fetch the category information for each category as well as the overall groups
- [ ] Compile a email-friendly report of the information
- [ ] Send the email to the desired parties via SMTP

View file

@ -33,6 +33,7 @@
# FIXME(TODO): Build the package
# packages.default =
devShells.default = pkgs.mkShell {
ENVIRONMENT = "dev";
nativeBuildInputs = with pkgs; [ go ];
};
};

5
go.mod Normal file
View file

@ -0,0 +1,5 @@
module git.wanderingcrow.net/actualbudget-report
go 1.25.2
require github.com/joho/godotenv v1.5.1

2
go.sum Normal file
View file

@ -0,0 +1,2 @@
github.com/joho/godotenv v1.5.1 h1:7eLL/+HRGLY0ldzfGMeQkb7vMd0as4CfYvUVzLqw0N0=
github.com/joho/godotenv v1.5.1/go.mod h1:f4LDr5Voq0i2e/R5DDNOoa2zzDfwtkZa6DnEwAbqwq4=

53
src/main.go Normal file
View file

@ -0,0 +1,53 @@
package main
import (
"github.com/joho/godotenv"
"log"
"net/http"
"os"
)
type BudgetClient struct {
baseUrl string
apiKey string
syncId string
}
func CreateBudgetClient(baseUrl string, apiKey string, syncId string) *BudgetClient {
client := BudgetClient{baseUrl, apiKey, syncId}
return &client
}
func (b BudgetClient) BankSync() bool {
var httpClient http.Client
req, err := http.NewRequest("POST", b.baseUrl+"/v1/budgets/"+b.syncId+"/accounts/banksync", http.NoBody)
if err != nil {
log.Fatal(err)
}
req.Header.Add("x-api-key", b.apiKey)
log.Println("Sent off request")
resp, err := httpClient.Do(req)
if err != nil {
log.Fatal(err)
}
log.Println(resp)
if resp.StatusCode == http.StatusOK {
return true
} else {
return false
}
}
func main() {
if os.Getenv("ENVIRONMENT") == "dev" {
err := godotenv.Load()
if err != nil {
log.Fatal("Error loading .env file")
}
}
var baseUrl = os.Getenv("BASE_URL")
var apiKey = os.Getenv("API_KEY")
var syncId = os.Getenv("SYNC_ID")
client := CreateBudgetClient(baseUrl, apiKey, syncId)
client.BankSync()
}