This repository has been archived by the owner on Dec 13, 2023. It is now read-only.
/
database.go
124 lines (99 loc) · 3.59 KB
/
database.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
package db
import (
"encoding/csv"
"errors"
"fmt"
"os"
"time"
"github.com/gocarina/gocsv"
"github.com/rs/zerolog/log"
)
var (
DatabaseFile = "database.csv"
LayoutString = "01/02/2006"
)
type Database struct {
RawRecords []Transaction
FilteredRecords []Transaction
FilteredParseableRecords [][]string
}
type Transaction struct {
Email string `csv:"user_email"`
Date string `csv:"date_of_transaction"`
Amount string `csv:"amount"`
}
// FilterRecords reads from DatabaseFile and stores filter records based on queried startDate and endDate
func (db *Database) FilterRecords(userEmail string, startDate time.Time, endDate time.Time) error {
file, err := os.Open(DatabaseFile)
if err != nil {
log.Debug().Err(err).Msg("Error opening database file")
return err
}
defer file.Close()
// Getting the entire 'database' from csv
if err := gocsv.UnmarshalFile(file, &db.RawRecords); err != nil {
log.Debug().Err(err).Msg("Unable to Unmarshald database csv file")
return err
}
// initializing columns for filtered records.
columns := []string{}
columns = append(columns, "user_email")
columns = append(columns, "date_of_transaction")
columns = append(columns, "amount")
db.FilteredParseableRecords = append(db.FilteredParseableRecords, columns)
// Filtering DB []Records
for _, record := range db.RawRecords {
filteredTransactionData := []string{}
transactionDate, err := time.Parse(LayoutString, record.Date)
if err != nil {
return errors.New("internal server error")
}
if record.Email == userEmail {
if startDate.Equal(transactionDate) || endDate.Equal(transactionDate) {
// if transactionDate is equal to either startDate or endDate
filteredTransactionData = append(filteredTransactionData, record.Email)
filteredTransactionData = append(filteredTransactionData, record.Date)
filteredTransactionData = append(filteredTransactionData, record.Amount)
db.FilteredRecords = append(db.FilteredRecords, record)
db.FilteredParseableRecords = append(db.FilteredParseableRecords, filteredTransactionData)
} else if startDate.Before(transactionDate) && endDate.After(transactionDate) {
// Else If transactionDate is in range between startDate and endDate
filteredTransactionData = append(filteredTransactionData, record.Email)
filteredTransactionData = append(filteredTransactionData, record.Date)
filteredTransactionData = append(filteredTransactionData, record.Amount)
db.FilteredRecords = append(db.FilteredRecords, record)
db.FilteredParseableRecords = append(db.FilteredParseableRecords, filteredTransactionData)
}
}
}
// error: unable to filter returning nil
return nil
}
// Adds a new Transaction record to the database csv file.
func (db *Database) AddRecord(record *Transaction) error {
database, err := os.OpenFile(DatabaseFile, os.O_APPEND|os.O_WRONLY, 0644)
if err != nil {
return errors.New("unable to open database file")
}
defer database.Close()
if record != nil {
rawTransactionData := []string{}
rawTransactionData = append(rawTransactionData, record.Email)
rawTransactionData = append(rawTransactionData, record.Date)
rawTransactionData = append(rawTransactionData, record.Amount)
fmt.Println(rawTransactionData)
w := csv.NewWriter(database)
w.Write(rawTransactionData)
if err := w.Error(); err != nil {
return fmt.Errorf("unable to write record: %v", err)
}
w.Flush()
return nil
}
return errors.New("no transaction record to add")
}
func (db *Database) Clear() {
db.FilteredParseableRecords = [][]string{}
db.FilteredRecords = []Transaction{}
db.RawRecords = []Transaction{}
}