diff --git a/core/api/account.go b/core/api/account.go index 76f7649..417de58 100644 --- a/core/api/account.go +++ b/core/api/account.go @@ -14,12 +14,12 @@ import ( /** * @api {get} /orgs/:orgId/accounts Get Accounts by Org id - * @apiVersion 1.2.0 + * @apiVersion 1.3.0 * @apiName GetOrgAccounts * @apiGroup Account * * @apiHeader {String} Authorization HTTP Basic Auth - * @apiHeader {String} Accept-Version ^1.2.0 semver versioning + * @apiHeader {String} Accept-Version ^1.3.0 semver versioning * * @apiSuccess {String} id Id of the Account. * @apiSuccess {String} orgId Id of the Org. @@ -86,12 +86,12 @@ func GetOrgAccounts(w rest.ResponseWriter, r *rest.Request) { /** * @api {get} /orgs/:orgId/accounts/:accountId Get Acount by Org id and Account id - * @apiVersion 1.2.0 + * @apiVersion 1.3.0 * @apiName GetOrgAccount * @apiGroup Account * * @apiHeader {String} Authorization HTTP Basic Auth - * @apiHeader {String} Accept-Version ^1.2.0 semver versioning + * @apiHeader {String} Accept-Version ^1.3.0 semver versioning * * @apiSuccess {String} id Id of the Account. * @apiSuccess {String} orgId Id of the Org. @@ -157,12 +157,12 @@ func GetOrgAccount(w rest.ResponseWriter, r *rest.Request) { /** * @api {post} /orgs/:orgId/accounts Create a new Account - * @apiVersion 1.2.0 + * @apiVersion 1.3.0 * @apiName PostAccount * @apiGroup Account * * @apiHeader {String} Authorization HTTP Basic Auth - * @apiHeader {String} Accept-Version ^1.2.0 semver versioning + * @apiHeader {String} Accept-Version ^1.3.0 semver versioning * * @apiParam {String} id Id 32 character hex string * @apiParam {String} name Name of the Account. @@ -270,12 +270,12 @@ func PostAccounts(w rest.ResponseWriter, r *rest.Request, content []byte) { /** * @api {put} /orgs/:orgId/accounts/:accountId Modify an Account - * @apiVersion 1.2.0 + * @apiVersion 1.3.0 * @apiName PutAccount * @apiGroup Account * * @apiHeader {String} Authorization HTTP Basic Auth - * @apiHeader {String} Accept-Version ^1.2.0 semver versioning + * @apiHeader {String} Accept-Version ^1.3.0 semver versioning * * @apiParam {String} id Id 32 character hex string * @apiParam {String} name Name of the Account. @@ -345,12 +345,12 @@ func PutAccount(w rest.ResponseWriter, r *rest.Request) { /** * @api {delete} /orgs/:orgId/accounts/:accountId Delete an Account - * @apiVersion 1.2.0 + * @apiVersion 1.3.0 * @apiName DeleteAccount * @apiGroup Account * * @apiHeader {String} Authorization HTTP Basic Auth - * @apiHeader {String} Accept-Version ^1.2.0 semver versioning + * @apiHeader {String} Accept-Version ^1.3.0 semver versioning * * @apiSuccessExample Success-Response: * HTTP/1.1 200 OK diff --git a/core/api/api.go b/core/api/api.go index 6badf6b..2b4ef44 100644 --- a/core/api/api.go +++ b/core/api/api.go @@ -7,6 +7,9 @@ import ( /** * Changelog * + * 1.3.0 + * - add org.timezone + * * 1.2.0 * - add `GET /orgs/:orgId/accounts/:accountId * diff --git a/core/api/apikey.go b/core/api/apikey.go index aaf32f3..5df5d83 100644 --- a/core/api/apikey.go +++ b/core/api/apikey.go @@ -9,12 +9,12 @@ import ( /** * @api {get} /apikeys Get API keys - * @apiVersion 1.2.0 + * @apiVersion 1.3.0 * @apiName GetApiKeys * @apiGroup ApiKey * * @apiHeader {String} Authorization HTTP Basic Auth - * @apiHeader {String} Accept-Version ^1.2.0 semver versioning + * @apiHeader {String} Accept-Version ^1.3.0 semver versioning * * @apiSuccess {String} id Id of the ApiKey. * @apiSuccess {Date} inserted Date ApiKey was created @@ -52,11 +52,11 @@ func GetApiKeys(w rest.ResponseWriter, r *rest.Request) { /** * @api {post} /apikeys Create a new API key - * @apiVersion 1.2.0 + * @apiVersion 1.3.0 * @apiName PostApiKey * @apiGroup ApiKey * - * @apiHeader {String} Accept-Version ^1.2.0 semver versioning + * @apiHeader {String} Accept-Version ^1.3.0 semver versioning * @apiHeader {String} Authorization HTTP Basic Auth * * @apiParam {String} id 32 character hex string @@ -105,11 +105,11 @@ func PostApiKey(w rest.ResponseWriter, r *rest.Request) { /** * @api {put} /apikeys Modify an API key - * @apiVersion 1.2.0 + * @apiVersion 1.3.0 * @apiName PutApiKey * @apiGroup ApiKey * - * @apiHeader {String} Accept-Version ^1.2.0 semver versioning + * @apiHeader {String} Accept-Version ^1.3.0 semver versioning * @apiHeader {String} Authorization HTTP Basic Auth * * @apiParam {String} id 32 character hex string @@ -160,12 +160,12 @@ func PutApiKey(w rest.ResponseWriter, r *rest.Request) { /** * @api {delete} /apikeys/:apiKeyId Delete an API key - * @apiVersion 1.2.0 + * @apiVersion 1.3.0 * @apiName DeleteApiKey * @apiGroup ApiKey * * @apiHeader {String} Authorization HTTP Basic Auth - * @apiHeader {String} Accept-Version ^1.2.0 semver versioning + * @apiHeader {String} Accept-Version ^1.3.0 semver versioning * * @apiSuccessExample Success-Response: * HTTP/1.1 200 OK diff --git a/core/api/org.go b/core/api/org.go index bea5a4b..d60aa17 100644 --- a/core/api/org.go +++ b/core/api/org.go @@ -9,12 +9,12 @@ import ( /** * @api {get} /org/:orgId Get Org by id - * @apiVersion 1.2.0 + * @apiVersion 1.3.0 * @apiName GetOrg * @apiGroup Org * * @apiHeader {String} Authorization HTTP Basic Auth - * @apiHeader {String} Accept-Version ^1.2.0 semver versioning + * @apiHeader {String} Accept-Version ^1.3.0 semver versioning * * @apiSuccess {String} id Id of the Org. * @apiSuccess {Date} inserted Date Org was created @@ -22,6 +22,7 @@ import ( * @apiSuccess {String} name Name of the Org. * @apiSuccess {String} currency Three letter currency code. * @apiSuccess {Number} precision How many digits the currency goes out to. + * @apiSuccess {String} timezone Timezone to use for accounting. * * @apiSuccessExample Success-Response: * HTTP/1.1 200 OK @@ -32,6 +33,7 @@ import ( * "name": "MyOrg", * "currency": "USD", * "precision": 2, + * "timezone": "America/New_York" * } * * @apiUse NotAuthorizedError @@ -53,12 +55,12 @@ func GetOrg(w rest.ResponseWriter, r *rest.Request) { /** * @api {get} /orgs Get a User's Orgs - * @apiVersion 1.2.0 + * @apiVersion 1.3.0 * @apiName GetOrgs * @apiGroup Org * * @apiHeader {String} Authorization HTTP Basic Auth - * @apiHeader {String} Accept-Version ^1.2.0 semver versioning + * @apiHeader {String} Accept-Version ^1.3.0 semver versioning * * @apiSuccess {String} id Id of the Org. * @apiSuccess {Date} inserted Date Org was created @@ -66,6 +68,7 @@ func GetOrg(w rest.ResponseWriter, r *rest.Request) { * @apiSuccess {String} name Name of the Org. * @apiSuccess {String} currency Three letter currency code. * @apiSuccess {Number} precision How many digits the currency goes out to. + @apiSuccess {String} timezone Timezone to use for accounting. * * @apiSuccessExample Success-Response: * HTTP/1.1 200 OK @@ -77,6 +80,7 @@ func GetOrg(w rest.ResponseWriter, r *rest.Request) { * "name": "MyOrg", * "currency": "USD", * "precision": 2, + * "timezone": "America/New_York" * } * ] * @@ -98,17 +102,18 @@ func GetOrgs(w rest.ResponseWriter, r *rest.Request) { /** * @api {post} /orgs Create a new Org - * @apiVersion 1.2.0 + * @apiVersion 1.3.0 * @apiName PostOrg * @apiGroup Org * * @apiHeader {String} Authorization HTTP Basic Auth - * @apiHeader {String} Accept-Version ^1.2.0 semver versioning + * @apiHeader {String} Accept-Version ^1.3.0 semver versioning * * @apiParam {String} id Id 32 character hex string * @apiParam {String} name Name of the Org. * @apiParam {String} currency Three letter currency code. * @apiParam {Number} precision How many digits the currency goes out to. + * @apiParam {String} timezone Timezone to use for accounting. * * @apiSuccess {String} id Id of the Org. * @apiSuccess {Date} inserted Date Org was created @@ -116,6 +121,7 @@ func GetOrgs(w rest.ResponseWriter, r *rest.Request) { * @apiSuccess {String} name Name of the Org. * @apiSuccess {String} currency Three letter currency code. * @apiSuccess {Number} precision How many digits the currency goes out to. + * @apiSuccess {String} timezone Timezone to use for accounting. * * @apiSuccessExample Success-Response: * HTTP/1.1 200 OK @@ -126,6 +132,7 @@ func GetOrgs(w rest.ResponseWriter, r *rest.Request) { * "name": "MyOrg", * "currency": "USD", * "precision": 2, + * "timezone": "America/New_York" * } * * @apiUse NotAuthorizedError @@ -152,12 +159,12 @@ func PostOrg(w rest.ResponseWriter, r *rest.Request) { /** * @api {put} /orgs/:orgId Modify an Org - * @apiVersion 1.2.0 + * @apiVersion 1.3.0 * @apiName PutOrg * @apiGroup Org * * @apiHeader {String} Authorization HTTP Basic Auth - * @apiHeader {String} Accept-Version ^1.2.0 semver versioning + * @apiHeader {String} Accept-Version ^1.3.0 semver versioning * * @apiParam {String} name Name of the Org. * @@ -167,6 +174,7 @@ func PostOrg(w rest.ResponseWriter, r *rest.Request) { * @apiSuccess {String} name Name of the Org. * @apiSuccess {String} currency Three letter currency code. * @apiSuccess {Number} precision How many digits the currency goes out to. + * @apiSuccess {String} timezone Timezone to use for accounting. * * @apiSuccessExample Success-Response: * HTTP/1.1 200 OK @@ -177,6 +185,7 @@ func PostOrg(w rest.ResponseWriter, r *rest.Request) { * "name": "MyOrg", * "currency": "USD", * "precision": 2, + * "timezone": "America/New_York" * } * * @apiUse NotAuthorizedError @@ -207,12 +216,12 @@ func PutOrg(w rest.ResponseWriter, r *rest.Request) { /** * @api {post} /orgs/:orgId/invites Invite a user to an Org - * @apiVersion 1.2.0 + * @apiVersion 1.3.0 * @apiName PostInvite * @apiGroup Org * * @apiHeader {String} Authorization HTTP Basic Auth - * @apiHeader {String} Accept-Version ^1.2.0 semver versioning + * @apiHeader {String} Accept-Version ^1.3.0 semver versioning * * @apiParam {String} email Email address of user * @@ -263,12 +272,12 @@ func PostInvite(w rest.ResponseWriter, r *rest.Request) { /** * @api {put} /orgs/:orgId/invites/:inviteId Accept an invitation - * @apiVersion 1.2.0 + * @apiVersion 1.3.0 * @apiName PutInvite * @apiGroup Org * * @apiHeader {String} Authorization HTTP Basic Auth - * @apiHeader {String} Accept-Version ^1.2.0 semver versioning + * @apiHeader {String} Accept-Version ^1.3.0 semver versioning * * @apiParam {String} accepted true * @@ -320,12 +329,12 @@ func PutInvite(w rest.ResponseWriter, r *rest.Request) { /** * @api {get} /orgs/:orgId/invites Get Org invites - * @apiVersion 1.2.0 + * @apiVersion 1.3.0 * @apiName GetInvites * @apiGroup Org * * @apiHeader {String} Authorization HTTP Basic Auth - * @apiHeader {String} Accept-Version ^1.2.0 semver versioning + * @apiHeader {String} Accept-Version ^1.3.0 semver versioning * * @apiSuccess {String} id Id of the Invite * @apiSuccess {orgId} id Id of the Org @@ -366,12 +375,12 @@ func GetInvites(w rest.ResponseWriter, r *rest.Request) { /** * @api {delete} /orgs/:orgId/invites/:inviteId Delete Invite - * @apiVersion 1.2.0 + * @apiVersion 1.3.0 * @apiName DeleteInvite * @apiGroup Org * * @apiHeader {String} Authorization HTTP Basic Auth - * @apiHeader {String} Accept-Version ^1.2.0 semver versioning + * @apiHeader {String} Accept-Version ^1.3.0 semver versioning * * @apiSuccessExample Success-Response: * HTTP/1.1 200 OK diff --git a/core/api/price.go b/core/api/price.go index 59863f2..08cd7f9 100644 --- a/core/api/price.go +++ b/core/api/price.go @@ -11,12 +11,12 @@ import ( /** * @api {get} /org/:orgId/prices Get prices nearest in time or by currency - * @apiVersion 1.2.0 + * @apiVersion 1.3.0 * @apiName GetPrices * @apiGroup Price * * @apiHeader {String} Authorization HTTP Basic Auth - * @apiHeader {String} Accept-Version ^1.2.0 semver versioning + * @apiHeader {String} Accept-Version ^1.3.0 semver versioning * * @apiParam {Number} nearestDate Milliseconds since epoch * @apiParam {String} currency Currency code @@ -93,12 +93,12 @@ func GetPrices(w rest.ResponseWriter, r *rest.Request) { /** * @api {post} /orgs/:orgId/prices Create a new Price - * @apiVersion 1.2.0 + * @apiVersion 1.3.0 * @apiName PostPrice * @apiGroup Price * * @apiHeader {String} Authorization HTTP Basic Auth - * @apiHeader {String} Accept-Version ^1.2.0 semver versioning + * @apiHeader {String} Accept-Version ^1.3.0 semver versioning * * @apiParam {String} id Id 32 character hex string. * @apiParam {String} orgId Id of the Org. @@ -155,12 +155,12 @@ func PostPrice(w rest.ResponseWriter, r *rest.Request) { /** * @api {delete} /orgs/:orgId/prices/:priceId Delete a Price - * @apiVersion 1.2.0 + * @apiVersion 1.3.0 * @apiName DeletePrice * @apiGroup Price * * @apiHeader {String} Authorization HTTP Basic Auth - * @apiHeader {String} Accept-Version ^1.2.0 semver versioning + * @apiHeader {String} Accept-Version ^1.3.0 semver versioning * * @apiSuccessExample Success-Response: * HTTP/1.1 200 OK diff --git a/core/api/session.go b/core/api/session.go index 203536b..05741ff 100644 --- a/core/api/session.go +++ b/core/api/session.go @@ -9,11 +9,11 @@ import ( /** * @api {post} /sessions Create a new Session - * @apiVersion 1.2.0 + * @apiVersion 1.3.0 * @apiName PostSession * @apiGroup Session * - * @apiHeader {String} Accept-Version ^1.2.0 semver versioning + * @apiHeader {String} Accept-Version ^1.3.0 semver versioning * @apiHeader {String} Authorization HTTP Basic Auth * * @apiParam {String} id 32 character hex string @@ -59,12 +59,12 @@ func PostSession(w rest.ResponseWriter, r *rest.Request) { /** * @api {delete} /sessions/:sessionId Log out of a Session - * @apiVersion 1.2.0 + * @apiVersion 1.3.0 * @apiName DeleteSession * @apiGroup Session * * @apiHeader {String} Authorization HTTP Basic Auth - * @apiHeader {String} Accept-Version ^1.2.0 semver versioning + * @apiHeader {String} Accept-Version ^1.3.0 semver versioning * * @apiSuccessExample Success-Response: * HTTP/1.1 200 OK diff --git a/core/api/syshealth.go b/core/api/syshealth.go index 9e5e11c..2862ff1 100644 --- a/core/api/syshealth.go +++ b/core/api/syshealth.go @@ -7,12 +7,12 @@ import ( /** * @api {get} /health-check Get system health status - * @apiVersion 1.2.0 + * @apiVersion 1.3.0 * @apiName GetSystemHealthStatus * @apiGroup SystemHealth * * - * @apiHeader {String} Accept-Version: 1.2.0 semver versioning + * @apiHeader {String} Accept-Version: 1.3.0 semver versioning * * @apiSuccess {String} database Database status: "ok"; "fail" * @apiSuccess {String} api API status: "ok" diff --git a/core/api/transaction.go b/core/api/transaction.go index d4b778b..a2a9965 100644 --- a/core/api/transaction.go +++ b/core/api/transaction.go @@ -9,12 +9,12 @@ import ( /** * @api {get} /orgs/:orgId/accounts/:accountId/transactions Get Transactions by Account Id - * @apiVersion 1.2.0 + * @apiVersion 1.3.0 * @apiName GetAccountTransactions * @apiGroup Transaction * * @apiHeader {String} Authorization HTTP Basic Auth - * @apiHeader {String} Accept-Version ^1.2.0 semver versioning + * @apiHeader {String} Accept-Version ^1.3.0 semver versioning * * @apiSuccess {String} id Id of the Transaction. * @apiSuccess {String} orgId Id of the Org. @@ -85,12 +85,12 @@ func GetTransactionsByAccount(w rest.ResponseWriter, r *rest.Request) { /** * @api {get} /orgs/:orgId/transactions Get Transactions by Org Id - * @apiVersion 1.2.0 + * @apiVersion 1.3.0 * @apiName GetOrgTransactions * @apiGroup Transaction * * @apiHeader {String} Authorization HTTP Basic Auth - * @apiHeader {String} Accept-Version ^1.2.0 semver versioning + * @apiHeader {String} Accept-Version ^1.3.0 semver versioning * * @apiSuccess {String} id Id of the Transaction. * @apiSuccess {String} orgId Id of the Org. @@ -160,12 +160,12 @@ func GetTransactionsByOrg(w rest.ResponseWriter, r *rest.Request) { /** * @api {post} /orgs/:orgId/transactions Create a new Transaction - * @apiVersion 1.2.0 + * @apiVersion 1.3.0 * @apiName PostTransaction * @apiGroup Transaction * * @apiHeader {String} Authorization HTTP Basic Auth - * @apiHeader {String} Accept-Version ^1.2.0 semver versioning + * @apiHeader {String} Accept-Version ^1.3.0 semver versioning * * @apiParam {String} id Id 32 character hex string * @apiParam {Date} date Date of the Transaction @@ -246,12 +246,12 @@ func PostTransaction(w rest.ResponseWriter, r *rest.Request) { /** * @api {put} /orgs/:orgId/transactions/:transactionId Modify a Transaction - * @apiVersion 1.2.0 + * @apiVersion 1.3.0 * @apiName PutTransaction * @apiGroup Transaction * * @apiHeader {String} Authorization HTTP Basic Auth - * @apiHeader {String} Accept-Version ^1.2.0 semver versioning + * @apiHeader {String} Accept-Version ^1.3.0 semver versioning * * @apiParam {String} id 32 character hex string * @apiParam {Date} date Date of the Transaction @@ -333,12 +333,12 @@ func PutTransaction(w rest.ResponseWriter, r *rest.Request) { /** * @api {delete} /orgs/:orgId/transactions/:transactionId Delete a Transaction - * @apiVersion 1.2.0 + * @apiVersion 1.3.0 * @apiName DeleteTransaction * @apiGroup Transaction * * @apiHeader {String} Authorization HTTP Basic Auth - * @apiHeader {String} Accept-Version ^1.2.0 semver versioning + * @apiHeader {String} Accept-Version ^1.3.0 semver versioning * * @apiSuccessExample Success-Response: * HTTP/1.1 200 OK diff --git a/core/api/user.go b/core/api/user.go index b8f46c8..3bc3f99 100644 --- a/core/api/user.go +++ b/core/api/user.go @@ -22,12 +22,12 @@ type ResetPasswordParams struct { /** * @api {get} /user Get Authenticated User - * @apiVersion 1.2.0 + * @apiVersion 1.3.0 * @apiName GetUser * @apiGroup User * * @apiHeader {String} Authorization HTTP Basic Auth - * @apiHeader {String} Accept-Version ^1.2.0 semver versioning + * @apiHeader {String} Accept-Version ^1.3.0 semver versioning * * @apiSuccess {String} id Id of the User. * @apiSuccess {Date} inserted Date User was created @@ -64,11 +64,11 @@ func GetUser(w rest.ResponseWriter, r *rest.Request) { /** * @api {post} /users Create a new User - * @apiVersion 1.2.0 + * @apiVersion 1.3.0 * @apiName PostUser * @apiGroup User * - * @apiHeader {String} Accept-Version ^1.2.0 semver versioning + * @apiHeader {String} Accept-Version ^1.3.0 semver versioning * * @apiParam {String} id 32 character hex string * @apiParam {String} firstName First name of the User. @@ -123,12 +123,12 @@ func PostUser(w rest.ResponseWriter, r *rest.Request) { /** * @api {put} /user Modify User - * @apiVersion 1.2.0 + * @apiVersion 1.3.0 * @apiName PutUser * @apiGroup User * * @apiHeader {String} Authorization HTTP Basic Auth - * @apiHeader {String} Accept-Version ^1.2.0 semver versioning + * @apiHeader {String} Accept-Version ^1.3.0 semver versioning * * @apiParam {String} password New password * @apiParam {String} code Password reset code. (Instead of Authorization header) @@ -204,11 +204,11 @@ func PutUser(w rest.ResponseWriter, r *rest.Request) { /** * @api {post} /user/verify Verify user email address - * @apiVersion 1.2.0 + * @apiVersion 1.3.0 * @apiName VerifyUser * @apiGroup User * - * @apiHeader {String} Accept-Version ^1.2.0 semver versioning + * @apiHeader {String} Accept-Version ^1.3.0 semver versioning * * @apiParam {String} code Email verification code * @@ -238,11 +238,11 @@ func VerifyUser(w rest.ResponseWriter, r *rest.Request) { /** * @api {post} /user/reset-password Send reset password email - * @apiVersion 1.2.0 + * @apiVersion 1.3.0 * @apiName ResetPassword * @apiGroup User * - * @apiHeader {String} Accept-Version ^1.2.0 semver versioning + * @apiHeader {String} Accept-Version ^1.3.0 semver versioning * * @apiParam {String} email Email address for user * diff --git a/core/api/version.go b/core/api/version.go index 29bb94e..2b152d8 100644 --- a/core/api/version.go +++ b/core/api/version.go @@ -31,7 +31,7 @@ func (mw *VersionMiddleware) MiddlewareFunc(handler rest.HandlerFunc) rest.Handl rest.Error(writer, "Invalid version", http.StatusBadRequest) } - serverVersion, _ := semver.NewVersion("1.2.0") + serverVersion, _ := semver.NewVersion("1.3.0") // Pre-release versions compatVersion, _ := semver.NewVersion("0.1.8") diff --git a/core/model/db/org.go b/core/model/db/org.go index 1706007..ae439f7 100644 --- a/core/model/db/org.go +++ b/core/model/db/org.go @@ -21,7 +21,7 @@ type OrgInterface interface { DeleteInvite(string) error } -const orgFields = "LOWER(HEX(o.id)),o.inserted,o.updated,o.name,o.currency,o.`precision`" +const orgFields = "LOWER(HEX(o.id)),o.inserted,o.updated,o.name,o.currency,o.`precision`,o.timezone" const inviteFields = "i.id,LOWER(HEX(i.orgId)),i.inserted,i.updated,i.email,i.accepted" func (db *DB) CreateOrg(org *types.Org, userId string, accounts []*types.Account) (err error) { @@ -46,7 +46,7 @@ func (db *DB) CreateOrg(org *types.Org, userId string, accounts []*types.Account org.Updated = org.Inserted // create org - query1 := "INSERT INTO org(id,inserted,updated,name,currency,`precision`) VALUES(UNHEX(?),?,?,?,?,?)" + query1 := "INSERT INTO org(id,inserted,updated,name,currency,`precision`,timezone) VALUES(UNHEX(?),?,?,?,?,?,?)" res, err := tx.Exec( query1, @@ -56,6 +56,7 @@ func (db *DB) CreateOrg(org *types.Org, userId string, accounts []*types.Account org.Name, org.Currency, org.Precision, + org.Timezone, ) if err != nil { @@ -126,11 +127,12 @@ func (db *DB) CreateOrg(org *types.Org, userId string, accounts []*types.Account func (db *DB) UpdateOrg(org *types.Org) error { org.Updated = time.Now() - query := "UPDATE org SET updated = ?, name = ? WHERE id = UNHEX(?)" + query := "UPDATE org SET updated = ?, name = ?, timezone = ? WHERE id = UNHEX(?)" _, err := db.Exec( query, util.TimeToMs(org.Updated), org.Name, + org.Timezone, org.Id, ) @@ -143,7 +145,7 @@ func (db *DB) GetOrg(orgId string, userId string) (*types.Org, error) { var updated int64 err := db.QueryRow("SELECT "+orgFields+" FROM org o JOIN userorg ON userorg.orgId = o.id WHERE o.id = UNHEX(?) AND userorg.userId = UNHEX(?)", orgId, userId). - Scan(&o.Id, &inserted, &updated, &o.Name, &o.Currency, &o.Precision) + Scan(&o.Id, &inserted, &updated, &o.Name, &o.Currency, &o.Precision, &o.Timezone) switch { case err == sql.ErrNoRows: @@ -173,7 +175,7 @@ func (db *DB) GetOrgs(userId string) ([]*types.Org, error) { var inserted int64 var updated int64 - err = rows.Scan(&o.Id, &inserted, &updated, &o.Name, &o.Currency, &o.Precision) + err = rows.Scan(&o.Id, &inserted, &updated, &o.Name, &o.Currency, &o.Precision, &o.Timezone) if err != nil { return nil, err } diff --git a/core/model/types/org.go b/core/model/types/org.go index 124bab5..34452cb 100644 --- a/core/model/types/org.go +++ b/core/model/types/org.go @@ -11,4 +11,5 @@ type Org struct { Name string `json:"name"` Currency string `json:"currency"` Precision int `json:"precision"` + Timezone string `json:"timezone"` } diff --git a/core/ws/ws.go b/core/ws/ws.go index b669c56..42db6bf 100644 --- a/core/ws/ws.go +++ b/core/ws/ws.go @@ -14,7 +14,7 @@ import ( "sync" ) -const version = "1.2.0" +const version = "1.3.0" //var upgrader = websocket.Upgrader{} // use default options var txSubscriptions = make(map[string][]*websocket.Conn) diff --git a/migrations/migrate2.go b/migrations/migrate2.go new file mode 100644 index 0000000..87f28d9 --- /dev/null +++ b/migrations/migrate2.go @@ -0,0 +1,105 @@ +package main + +import ( + "encoding/json" + "github.com/openaccounting/oa-server/core/model/db" + "github.com/openaccounting/oa-server/core/model/types" + "log" + "os" +) + +func main() { + if len(os.Args) != 2 { + log.Fatal("Usage: migrate2.go ") + } + + command := os.Args[1] + + if command != "upgrade" && command != "downgrade" { + log.Fatal("Usage: migrate2.go ") + } + + //filename is the path to the json config file + var config types.Config + file, err := os.Open("./config.json") + + if err != nil { + log.Fatal(err) + } + + decoder := json.NewDecoder(file) + err = decoder.Decode(&config) + + if err != nil { + log.Fatal(err) + } + + connectionString := config.User + ":" + config.Password + "@/" + config.Database + db, err := db.NewDB(connectionString) + + if command == "upgrade" { + err = upgrade(db) + } else { + err = downgrade(db) + } + + if err != nil { + log.Fatal(err) + } + + log.Println("done") +} + +func upgrade(db *db.DB) (err error) { + tx, err := db.Begin() + + if err != nil { + return + } + + defer func() { + if p := recover(); p != nil { + tx.Rollback() + panic(p) // re-throw panic after Rollback + } else if err != nil { + tx.Rollback() + } else { + err = tx.Commit() + } + }() + + query1 := "ALTER TABLE org ADD COLUMN timezone VARCHAR(100) NOT NULL AFTER `precision`" + + if _, err = tx.Exec(query1); err != nil { + return + } + + return +} + +func downgrade(db *db.DB) (err error) { + tx, err := db.Begin() + + if err != nil { + return + } + + defer func() { + if p := recover(); p != nil { + tx.Rollback() + panic(p) // re-throw panic after Rollback + } else if err != nil { + tx.Rollback() + } else { + err = tx.Commit() + } + }() + + query1 := "ALTER TABLE org DROP COLUMN timezone" + + if _, err = tx.Exec(query1); err != nil { + return + } + + return +} diff --git a/schema.sql b/schema.sql index 998beea..36aa3a4 100644 --- a/schema.sql +++ b/schema.sql @@ -4,7 +4,7 @@ CREATE DATABASE openaccounting CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; use openaccounting; -CREATE TABLE org (id BINARY(16) NOT NULL, inserted BIGINT UNSIGNED NOT NULL, updated BIGINT UNSIGNED NOT NULL, name VARCHAR(100) NOT NULL, currency VARCHAR(10) NOT NULL, `precision` INT NOT NULL, PRIMARY KEY(id)) ENGINE=InnoDB; +CREATE TABLE org (id BINARY(16) NOT NULL, inserted BIGINT UNSIGNED NOT NULL, updated BIGINT UNSIGNED NOT NULL, name VARCHAR(100) NOT NULL, currency VARCHAR(10) NOT NULL, `precision` INT NOT NULL, timezone VARCHAR(100) NOT NULL, PRIMARY KEY(id)) ENGINE=InnoDB; CREATE TABLE user (id BINARY(16) NOT NULL, inserted BIGINT UNSIGNED NOT NULL, updated BIGINT UNSIGNED NOT NULL, firstName VARCHAR(50) NOT NULL, lastName VARCHAR(50) NOT NULL, email VARCHAR(100) NOT NULL, passwordHash VARCHAR(100) NOT NULL, agreeToTerms BOOLEAN NOT NULL, passwordReset VARCHAR(32) NOT NULL, emailVerified BOOLEAN NOT NULL, emailVerifyCode VARCHAR(32) NOT NULL, signupSource VARCHAR(100) NOT NULL, UNIQUE(email), PRIMARY KEY(id)) ENGINE=InnoDB;