docs, fix empty

v0.1.10 v0.1.10
Vernon Keenan 2021-01-17 19:13:54 -08:00
parent 105ade2f84
commit 37245451a3
60 changed files with 458 additions and 25 deletions

View File

@ -117,8 +117,8 @@ func UnMarshalAccount(s *crm_models.Account) *Account { //nolint:funlen // too b
}
}
// MarshalToSwagger encodes a first class object to swagger
func (obj *Account) MarshalToSwagger() *crm_models.Account {
// Marshal encodes a first class object to swagger
func (obj *Account) Marshal() *crm_models.Account {
return &crm_models.Account{
ID: obj.ID,
AccountNumber: obj.AccountNumber,

View File

@ -6,9 +6,6 @@ import (
"code.tnxs.net/taxnexus/lib/api/crm/crm_models"
)
// NewAccountActivity is an activity identifier
const NewAccountActivity = "NEW_ACCOUNT_ACTIVITY"
// AccountChannelWrapper wraps the object with workflow params
type AccountChannelWrapper struct {
Obj crm_models.Account

View File

@ -8,6 +8,7 @@ import (
"github.com/google/uuid"
)
// UnMarshalAccountingRule decodes swagger to first class object
func UnMarshalAccountingRule(s *ledger_models.AccountingRule) *AccountingRule {
if s.ID == "" {
s.ID = uuid.New().String()
@ -43,6 +44,8 @@ func UnMarshalAccountingRule(s *ledger_models.AccountingRule) *AccountingRule {
},
}
}
// MarshalToSwagger encodes first class object
func (obj *AccountingRule) MarshalToSwagger() *ledger_models.AccountingRule {
return &ledger_models.AccountingRule{
ID: obj.ID,

View File

@ -8,6 +8,7 @@ import (
"github.com/google/uuid"
)
// UnMarshalAccountingRuleset decodes swagger to first class object
func UnMarshalAccountingRuleset(s *ledger_models.AccountingRuleset) *AccountingRuleset {
if s.ID == "" {
s.ID = uuid.New().String()
@ -37,6 +38,8 @@ func UnMarshalAccountingRuleset(s *ledger_models.AccountingRuleset) *AccountingR
},
}
}
// MarshalToSwagger encodes first class object
func (obj *AccountingRuleset) MarshalToSwagger() *ledger_models.AccountingRuleset {
theItems := []*ledger_models.AccountingRulesetItem{}
for _, itm := range obj.Items {

View File

@ -8,13 +8,14 @@ import (
"github.com/google/uuid"
)
func UnMarshalAppLog(s *workflow_models.AppLog) *AppLog {
// UnMarshalLog decodes swagger to first class object
func UnMarshalLog(s *workflow_models.AppLog) *Log {
if s.ID == "" {
s.ID = uuid.New().String()
}
createdDate, e0 := time.Parse(dateTimeFormat, s.CreatedDate)
sourceTimestamp, e1 := time.Parse(dateTimeFormat, s.SourceTimestamp)
return &AppLog{
return &Log{
AccountID: s.AccountID,
CompanyID: s.CompanyID,
CreatedByID: s.CreatedByID,
@ -35,7 +36,8 @@ func UnMarshalAppLog(s *workflow_models.AppLog) *AppLog {
}
}
func (obj *AppLog) MarshalToSwagger() *workflow_models.AppLog {
// MarshalToSwagger encodes first class object
func (obj *Log) MarshalToSwagger() *workflow_models.AppLog {
return &workflow_models.AppLog{
ID: obj.ID,
AccountID: obj.AccountID,

View File

@ -7,8 +7,75 @@ import (
"net/http"
"strings"
"time"
"code.tnxs.net/taxnexus/lib/api/auth0/auth0_client/user"
"code.tnxs.net/taxnexus/lib/api/auth0/auth0_models"
)
// GetAuth0UserByEmail looks up Auth0 user by email
func GetAuth0UserByEmail(email string) (string, error) {
sugar.Info("app.GetAuth0UserByEmail: 📥")
authToken := GetAuth0AccessToken()
if authToken == "" {
return "", fmt.Errorf("app.GetAuth0UserByEmail: 💣⛔ Error obtaining bearer token")
}
auth0Params := user.NewGetUserByEmailParamsWithTimeout(getTimeout)
auth0Params.Authorization = "Bearer " + authToken
auth0Params.Email = email
auth0Response, err := auth0Client.User.GetUserByEmail(auth0Params)
if err != nil {
return "", err
}
if len(auth0Response.Payload) == 0 {
sugar.Infof("app.GetAuth0UserByEmail: 👍📤 %s not found", email)
return constNotFound, nil
}
sugar.Infof("app.GetAuth0UserByEmail: 👍📤 %s found %s", email, auth0Response.Payload[0].UserID)
return auth0Response.Payload[0].UserID, nil
}
// CreateNewAuth0User creates a new Auth0 User
func CreateNewAuth0User(newUser *NewAuth0User) (string, error) {
sugar.Info("app.CreateNewAuth0User: 📥")
authToken := GetAuth0AccessToken()
if authToken == "" {
return "", fmt.Errorf("app.CreateNewAuth0User: 💣⛔ Error obtaining bearer token")
}
auth0Params := user.NewPostUsersParamsWithTimeout(postTimeout)
auth0Params.Authorization = "Bearer " + authToken
auth0Params.UserRequest.Users = []*auth0_models.NewUser{
{
Email: newUser.Email,
Name: newUser.Name,
FamilyName: newUser.FamilyName,
GivenName: newUser.GivenName,
Nickname: newUser.Nickname,
Password: newUser.Password,
PhoneNumber: newUser.PhoneNumber,
Blocked: newUser.Blocked,
Connection: newUser.Connection,
EmailVerified: newUser.EmailVerified,
PhoneVerified: newUser.PhoneVerified,
Picture: newUser.Picture,
UserID: newUser.UserID,
Username: newUser.Username,
VerifyEmail: newUser.VerifyEmail,
},
}
_, err := auth0Client.User.PostUsers(auth0Params)
if err != nil {
return "", err
}
auth0UserID, err := GetAuth0UserByEmail(newUser.Email)
if err != nil {
return "", err
}
if auth0UserID != constNotFound {
return "", fmt.Errorf("app.CreateNewAuth0User: 💣⛔ Auth0 user exists: %s", auth0UserID)
}
return auth0UserID, nil
}
type auth0TokenResponse struct {
AccessToken string
TokenType string

View File

@ -8,6 +8,7 @@ import (
"github.com/google/uuid"
)
// UnMarshalSwaggerAuthority decodes swagger to first class object
func UnMarshalSwaggerAuthority(s *regs_models.Authority) *Authority {
if s.ID == "" {
s.ID = uuid.New().String()
@ -71,6 +72,8 @@ func UnMarshalSwaggerAuthority(s *regs_models.Authority) *Authority {
},
}
}
// MarshalToSwagger encodes first class object
func (obj *Authority) MarshalToSwagger() *regs_models.Authority {
return &regs_models.Authority{
ID: obj.ID,

View File

@ -8,6 +8,7 @@ import (
"github.com/google/uuid"
)
// UnMarshalContact decodes swagger to first class object
func UnMarshalContact(s *crm_models.Contact) *Contact {
if s.ID == "" {
s.ID = uuid.New().String()
@ -75,6 +76,8 @@ func UnMarshalContact(s *crm_models.Contact) *Contact {
},
}
}
// MarshalToSwagger encodes first class object
func (obj *Contact) MarshalToSwagger() *crm_models.Contact {
return &crm_models.Contact{
ID: obj.ID,

View File

@ -8,6 +8,7 @@ import (
"github.com/google/uuid"
)
// UnMarshalCountry decodes swagger to first class object
func UnMarshalCountry(s *geo_models.Country) *Country {
if s.ID == "" {
s.ID = uuid.New().String()
@ -58,6 +59,8 @@ func UnMarshalCountry(s *geo_models.Country) *Country {
},
}
}
// MarshalToSwagger encodes first class object
func (obj *Country) MarshalToSwagger() *geo_models.Country {
taxInstances := []*geo_models.TaxInstance{}
for _, itm := range obj.TaxInstances {

View File

@ -8,6 +8,7 @@ import (
"github.com/google/uuid"
)
// UnMarshalCounty decodes swagger to first class object
func UnMarshalCounty(s *geo_models.County) *County {
if s.ID == "" {
s.ID = uuid.New().String()
@ -69,6 +70,8 @@ func UnMarshalCounty(s *geo_models.County) *County {
},
}
}
// MarshalToSwagger encodes first class object
func (obj *County) MarshalToSwagger() *geo_models.County {
theInstances := []*geo_models.TaxInstance{}
for _, itm := range obj.TaxInstances {

View File

@ -2,6 +2,7 @@ package app
import "code.tnxs.net/taxnexus/lib/api/geo/geo_models"
// UnMarshalDomain decodes swagger to first class object
func UnMarshalDomain(swag *geo_models.Domain) *Domain {
return &Domain{
Description: swag.Description,
@ -10,6 +11,8 @@ func UnMarshalDomain(swag *geo_models.Domain) *Domain {
Name: swag.Name,
}
}
// MarshalToSwagger encodes first class object
func (obj *Domain) MarshalToSwagger() *geo_models.Domain {
return &geo_models.Domain{
ID: obj.ID,

View File

@ -2,6 +2,7 @@ package app
import "code.tnxs.net/taxnexus/lib/api/workflow/workflow_models"
// MarshalToSwagger encodes first class object
func (obj *EmailMessage) MarshalToSwagger() *workflow_models.EmailMessage {
headers := &workflow_models.Headers{}
// for _, itm := range obj.Headers {

View File

@ -8,6 +8,7 @@ import (
"github.com/google/uuid"
)
// UnMarshalSwaggerFiling decodes swagger to first class object
func UnMarshalSwaggerFiling(s *regs_models.Filing) *Filing {
if s.ID == "" {
s.ID = uuid.New().String()
@ -78,8 +79,9 @@ func UnMarshalSwaggerFiling(s *regs_models.Filing) *Filing {
Valid: e3 == nil,
},
}
}
// MarshalToSwagger encodes first class object
func (obj *Filing) MarshalToSwagger() *regs_models.Filing {
return &regs_models.Filing{
ID: obj.ID,

View File

@ -0,0 +1 @@
package app

View File

@ -8,6 +8,7 @@ import (
"github.com/google/uuid"
)
// UnMarshalFilingType decodes swagger to first class object
func UnMarshalFilingType(s *regs_models.FilingType) *FilingType {
if s.ID == "" {
s.ID = uuid.New().String()
@ -30,15 +31,15 @@ func UnMarshalFilingType(s *regs_models.FilingType) *FilingType {
}
for _, itm := range s.DueDates {
dueDates = []*FilingScheduleItem{}
dueDate, e0 := time.Parse(dateTimeFormat, itm.DueDate)
if e0 != nil {
dueDate, e0 = time.Parse(dateFormatAlt, itm.DueDate)
dueDate, e2 := time.Parse(dateTimeFormat, itm.DueDate)
if e2 != nil {
dueDate, e2 = time.Parse(dateFormatAlt, itm.DueDate)
}
dueDates = append(dueDates, &FilingScheduleItem{
Description: itm.Description,
DueDate: sql.NullTime{
Time: dueDate,
Valid: e0 == nil,
Valid: e2 == nil,
},
})
}
@ -78,6 +79,7 @@ func UnMarshalFilingType(s *regs_models.FilingType) *FilingType {
}
}
// MarshalToSwagger encodes first class object
func (obj *FilingType) MarshalToSwagger() *regs_models.FilingType {
var instances []*regs_models.FilingTypeInstance
if obj.Instances != nil {

View File

@ -0,0 +1 @@
package app

View File

@ -0,0 +1 @@
package app

View File

@ -45,6 +45,7 @@ func UnMarshalGlAccount(s *ledger_models.GlAccount) *GlAccount {
}
}
// MarshalToSwagger encodes first class object
func (obj *GlAccount) MarshalToSwagger() *ledger_models.GlAccount {
return &ledger_models.GlAccount{
ID: obj.ID,

View File

@ -8,6 +8,7 @@ import (
"github.com/google/uuid"
)
// UnMarshalGlBalance decodes swagger to first class object
func UnMarshalGlBalance(s *ledger_models.GlBalance) *GlBalance {
if s.ID == "" {
s.ID = uuid.New().String()
@ -46,6 +47,8 @@ func UnMarshalGlBalance(s *ledger_models.GlBalance) *GlBalance {
},
}
}
// MarshalToSwagger encodes first class object
func (obj *GlBalance) MarshalToSwagger() *ledger_models.GlBalance {
return &ledger_models.GlBalance{
ID: obj.ID,

View File

@ -4,6 +4,7 @@ import "code.tnxs.net/taxnexus/lib/api/ops/ops_models"
// Invoice unMarshal does validation in the Ops microservice only
// MarshalToSwagger encodes first class object
func (obj *Invoice) MarshalToSwagger() *ops_models.Invoice { //nolint:funlen // big object
var items []*ops_models.InvoiceItem
if obj.Items != nil {

View File

@ -4,6 +4,7 @@ import "code.tnxs.net/taxnexus/lib/api/ops/ops_models"
// Invoice unMarshal does validation in the Ops microservice only
// MarshalToSwagger encodes first class object
func (obj *InvoiceItem) MarshalToSwagger() *ops_models.InvoiceItem {
return &ops_models.InvoiceItem{
ID: obj.ID,

View File

@ -9,6 +9,7 @@ import (
"github.com/google/uuid"
)
// UnMarshalJournalEntry decodes swagger to first class object
func UnMarshalJournalEntry(s *ledger_models.JournalEntry) *JournalEntry {
if s.ID == "" {
s.ID = uuid.New().String()
@ -60,6 +61,7 @@ func UnMarshalJournalEntry(s *ledger_models.JournalEntry) *JournalEntry {
}
}
// MarshalToSwagger encodes first class object
func (obj *JournalEntry) MarshalToSwagger() *ledger_models.JournalEntry {
swag := &ledger_models.JournalEntry{
ID: obj.ID,
@ -84,7 +86,7 @@ func (obj *JournalEntry) MarshalToSwagger() *ledger_models.JournalEntry {
TenantID: obj.TenantID,
}
for _, itm := range obj.Items {
swag.Items = append(swag.Items, itm.MarshalToSwgger())
swag.Items = append(swag.Items, itm.MarshalToSwagger())
}
return swag
}

View File

@ -45,7 +45,8 @@ func UnMarshalJournalItem(s *ledger_models.JournalItem) *JournalItem {
}
}
func (obj *JournalItem) MarshalToSwgger() *ledger_models.JournalItem {
// MarshalToSwagger encodes first class object
func (obj *JournalItem) MarshalToSwagger() *ledger_models.JournalItem {
return &ledger_models.JournalItem{
ID: obj.ID,
CreatedByID: obj.CreatedByID,

View File

@ -8,6 +8,7 @@ import (
"github.com/google/uuid"
)
// UnMarshalLead decodes swagger to first class object
func UnMarshalLead(s *crm_models.Lead) *Lead {
if s.ID == "" {
s.ID = uuid.New().String()
@ -52,6 +53,7 @@ func UnMarshalLead(s *crm_models.Lead) *Lead {
}
}
// MarshalToSwagger encodes first class object
func (obj *Lead) MarshalToSwagger() *crm_models.Lead {
return &crm_models.Lead{
ID: obj.ID,

View File

@ -8,6 +8,7 @@ import (
"github.com/google/uuid"
)
// UnMarshalLicense decodes swagger to first class object
func UnMarshalLicense(s *regs_models.License) *License {
if s.ID == "" {
s.ID = uuid.New().String()
@ -57,6 +58,8 @@ func UnMarshalLicense(s *regs_models.License) *License {
},
}
}
// MarshalToSwagger encodes first class object
func (obj *License) MarshalToSwagger() *regs_models.License {
return &regs_models.License{
ID: obj.ID,

View File

@ -8,6 +8,7 @@ import (
"github.com/google/uuid"
)
// UnMarshalLicenseType decodes swagger to first class object
func UnMarshalLicenseType(s *regs_models.LicenseType) *LicenseType {
if s.ID == "" {
s.ID = uuid.New().String()
@ -57,6 +58,7 @@ func UnMarshalLicenseType(s *regs_models.LicenseType) *LicenseType {
}
}
// MarshalToSwagger encodes first class object
func (obj *LicenseType) MarshalToSwagger() *regs_models.LicenseType {
var jurisdictions []*regs_models.GeoLicenseTypeInstance
if obj.Jurisdictions != nil {

View File

@ -7,6 +7,7 @@ import (
"code.tnxs.net/taxnexus/lib/api/regs/regs_models"
)
// UnMarshalNotebook decodes swagger to first class object
func UnMarshalNotebook(s *regs_models.Notebook) *Notebook {
createdDate, e0 := time.Parse(dateTimeFormat, s.CreatedDate)
lastModfiedDate, e1 := time.Parse(dateTimeFormat, s.LastModifiedDate)
@ -23,7 +24,6 @@ func UnMarshalNotebook(s *regs_models.Notebook) *Notebook {
Title: itm.Title,
NotebookID: itm.NotebookID,
})
}
}
return &Notebook{
@ -61,7 +61,9 @@ func UnMarshalNotebook(s *regs_models.Notebook) *Notebook {
},
}
}
func (obj Notebook) MarshalToSwagger() *regs_models.Notebook {
// MarshalToSwagger encodes first class object
func (obj *Notebook) MarshalToSwagger() *regs_models.Notebook {
var items []*regs_models.NotebookItem
if obj.Items != nil {
items = []*regs_models.NotebookItem{}
@ -72,7 +74,6 @@ func (obj Notebook) MarshalToSwagger() *regs_models.Notebook {
Title: itm.Title,
NotebookID: itm.NotebookID,
})
}
}
return &regs_models.Notebook{

View File

@ -8,13 +8,14 @@ import (
"github.com/google/uuid"
)
// UnMarshalOrder decodes swagger to first class object
func UnMarshalOrder(s *ops_models.Order) *Order { //nolint:funlen // big object
if s.ID == "" {
s.ID = uuid.New().String()
}
var items []*OrderItem
if s.Items != nil {
items = make([]*OrderItem, 5)
items = []*OrderItem{}
for _, itm := range s.Items {
items = append(items, UnMarshalOrderItem(itm))
}
@ -137,6 +138,8 @@ func UnMarshalOrder(s *ops_models.Order) *Order { //nolint:funlen // big object
},
}
}
// MarshalToSwagger encodes first class object
func (obj *Order) MarshalToSwagger() *ops_models.Order {
var items []*ops_models.OrderItem
if obj.Items != nil {

View File

@ -8,6 +8,7 @@ import (
"github.com/google/uuid"
)
// UnMarshalOrderItem decodes swagger to first class object
func UnMarshalOrderItem(s *ops_models.OrderItem) *OrderItem {
if s.ID == "" {
s.ID = uuid.New().String()
@ -82,6 +83,7 @@ func UnMarshalOrderItem(s *ops_models.OrderItem) *OrderItem {
}
}
// MarshalToSwagger encodes first class object
func (obj *OrderItem) MarshalToSwagger() *ops_models.OrderItem {
return &ops_models.OrderItem{
ID: obj.ID,

View File

@ -2,6 +2,7 @@ package app
import "code.tnxs.net/taxnexus/lib/api/workflow/workflow_models"
// UnMarshalSwaggerOutgoingEmailMessage decodes swagger to first class object
func UnMarshalSwaggerOutgoingEmailMessage(s *workflow_models.OutgoingEmailMessage) *OutgoingEmailMessage {
return &OutgoingEmailMessage{
ID: s.ID,

View File

@ -2,6 +2,7 @@ package app
import "code.tnxs.net/taxnexus/lib/api/workflow/workflow_models"
// MarshalToSwagger encodes first class object
func (obj *OutgoingEmailMessageReceipt) MarshalToSwagger() *workflow_models.EmailMessage {
return &workflow_models.EmailMessage{
ID: obj.ID,

View File

@ -2,8 +2,8 @@ package app
import "code.tnxs.net/taxnexus/lib/api/stash/stash_models"
// MarshalToDocument encodes first class object to swagger
func (obj *PDF) MarshalToDocument() *stash_models.Document {
return &stash_models.Document{
ID: obj.ID,
Filename: obj.Filename,
@ -13,6 +13,7 @@ func (obj *PDF) MarshalToDocument() *stash_models.Document {
}
}
// UnMarshalNewPDF decodes swagger to first class object
func UnMarshalNewPDF(swag *stash_models.NewPDF) *PDF {
return &PDF{
Description: swag.Description,

View File

@ -8,6 +8,7 @@ import (
"github.com/google/uuid"
)
// UnMarshalPeriod decodes swagger to first class object
func UnMarshalPeriod(s *ledger_models.Period) *Period {
if s.ID == "" {
s.ID = uuid.New().String()
@ -51,6 +52,8 @@ func UnMarshalPeriod(s *ledger_models.Period) *Period {
},
}
}
// MarshalToSwagger encodes first class object
func (obj *Period) MarshalToSwagger() *ledger_models.Period {
return &ledger_models.Period{
ID: obj.ID,

View File

@ -8,6 +8,7 @@ import (
"github.com/google/uuid"
)
// UnMarshalPlace decodes swagger to first class object
func UnMarshalPlace(s *geo_models.Place) *Place {
if s.ID == "" {
s.ID = uuid.New().String()
@ -73,6 +74,8 @@ func UnMarshalPlace(s *geo_models.Place) *Place {
},
}
}
// MarshalToSwagger encodes first class object
func (obj *Place) MarshalToSwagger() *geo_models.Place {
if obj == nil {
return nil

View File

@ -8,6 +8,7 @@ import (
"github.com/google/uuid"
)
// UnMarshalPurchaseOrder decodes swagger to first class object
func UnMarshalPurchaseOrder(s *ops_models.PurchaseOrder) (*PurchaseOrder, error) { //nolint:funlen // big object
if s.ID == "" {
s.ID = uuid.New().String()
@ -120,6 +121,8 @@ func UnMarshalPurchaseOrder(s *ops_models.PurchaseOrder) (*PurchaseOrder, error)
},
}, nil
}
// MarshalToSwagger encodes first class object
func (obj *PurchaseOrder) MarshalToSwagger() *ops_models.PurchaseOrder {
var items []*ops_models.PurchaseOrderItem
if obj.Items != nil {

View File

@ -8,6 +8,7 @@ import (
"github.com/google/uuid"
)
// UnMarshalPurchaseOrderItem decodes swagger to first class object
func UnMarshalPurchaseOrderItem(s *ops_models.PurchaseOrderItem) *PurchaseOrderItem {
if s.ID == "" {
s.ID = uuid.New().String()
@ -57,6 +58,8 @@ func UnMarshalPurchaseOrderItem(s *ops_models.PurchaseOrderItem) *PurchaseOrderI
},
}
}
// MarshalToSwagger encodes first class object
func (obj *PurchaseOrderItem) MarshalToSwagger() *ops_models.PurchaseOrderItem {
return &ops_models.PurchaseOrderItem{
ID: obj.ID,

View File

@ -8,6 +8,7 @@ import (
"github.com/google/uuid"
)
// UnMarshalProduct decodes swagger to first class object
func UnMarshalProduct(s *ops_models.Product) *Product {
if s.ID == "" {
s.ID = uuid.New().String()
@ -57,6 +58,8 @@ func UnMarshalProduct(s *ops_models.Product) *Product {
},
}
}
// MarshalToSwagger encodes first class object
func (obj *Product) MarshalToSwagger() *ops_models.Product {
return &ops_models.Product{
ID: obj.ID,

View File

@ -2,6 +2,7 @@ package app
import "code.tnxs.net/taxnexus/lib/api/ops/ops_models"
// MarshalToSwagger encodes first class object
func (obj *Quote) MarshalToSwagger() *ops_models.Quote {
var items []*ops_models.QuoteItem
if obj.Items != nil {

View File

@ -2,6 +2,7 @@ package app
import "code.tnxs.net/taxnexus/lib/api/ops/ops_models"
// MarshalToSwagger encodes first class object
func (obj *QuoteItem) MarshalToSwagger() *ops_models.QuoteItem {
return &ops_models.QuoteItem{
ID: obj.ID,

View File

@ -0,0 +1 @@
package app

View File

@ -0,0 +1 @@
package app

View File

@ -3,7 +3,9 @@ package app
import (
"strings"
"time"
"code.tnxs.net/taxnexus/lib/api/auth0/auth0_client"
"code.tnxs.net/taxnexus/lib/app/logger"
"github.com/spf13/viper"
"go.uber.org/zap"
@ -13,14 +15,17 @@ import (
var sugar *zap.SugaredLogger
var config = Configuration{}
var appViper = viper.New()
var auth0Client = auth0_client.Default
var configured = false
const getTimeout = 6 * time.Minute
const postTimeout = 6 * time.Minute
const constNotFound = "not found"
const dateFormat = "2006-01-02"
const dateTimeFormat = "2006-01-02T15:04:05-0800"
const dateTimeFormatAlt = "2006-01-02 15:04:05"
const dateFormatAlt = "1/2/2006"
var configured = false
// InitConfig exports the config initialization func
func InitConfig(systemName string) {
if configured {
@ -46,3 +51,9 @@ func InitConfig(systemName string) {
sugar.Debugf("app.InitConfig: 👍 📤 serviceAccounts: %d", len(config.ServiceAccounts))
configured = true
}
// FirstClassObject is a struct
type FirstClassObject interface {
Marshal() interface{}
UnMarshal() interface{}
}

View File

@ -7,6 +7,7 @@ import (
"code.tnxs.net/taxnexus/lib/api/geo/geo_models"
)
// UnMarshalSwaggerState decodes swagger to first class object
func UnMarshalSwaggerState(s *geo_models.State) *State {
createdDate, e0 := time.Parse(dateTimeFormat, s.CreatedDate)
lastModfiedDate, e1 := time.Parse(dateTimeFormat, s.LastModifiedDate)
@ -65,6 +66,7 @@ func UnMarshalSwaggerState(s *geo_models.State) *State {
}
}
// MarshalToSwagger encodes first class object
func (obj *State) MarshalToSwagger() *geo_models.State {
taxInstances := []*geo_models.TaxInstance{}
for _, itm := range obj.TaxInstances {

View File

@ -8,6 +8,7 @@ import (
"github.com/google/uuid"
)
// UnMarshalSubmission decodes swagger to first class object
func UnMarshalSubmission(s *regs_models.Submission) *Submission {
if s.ID == "" {
s.ID = uuid.New().String()
@ -57,6 +58,7 @@ func UnMarshalSubmission(s *regs_models.Submission) *Submission {
}
}
// MarshalToSwagger encodes first class object
func (obj *Submission) MarshalToSwagger() *regs_models.Submission {
return &regs_models.Submission{
ID: obj.ID,

View File

@ -34,6 +34,8 @@ func UnMarshalTaxInstance(s *geo_models.TaxInstance) *TaxInstance {
},
}
}
// MarshalToSwagger encodes first class object
func (obj *TaxInstance) MarshalToSwagger() *geo_models.TaxInstance {
return &geo_models.TaxInstance{
ID: obj.ID,

View File

@ -8,6 +8,7 @@ import (
"github.com/google/uuid"
)
// UnMarshalTaxnexusCode decodes swagger to first class object
func UnMarshalTaxnexusCode(s *geo_models.TaxnexusCode) *TaxnexusCode {
if s.ID == "" {
s.ID = uuid.New().String()
@ -45,6 +46,8 @@ func UnMarshalTaxnexusCode(s *geo_models.TaxnexusCode) *TaxnexusCode {
},
}
}
// MarshalToSwagger encodes first class object
func (obj *TaxnexusCode) MarshalToSwagger() *geo_models.TaxnexusCode {
swag := geo_models.TaxnexusCode{
ID: obj.ID,

View File

@ -6,6 +6,7 @@ import (
// TaxTransaction is not ingested, hence no UnMarshalTaxTransaction
// MarshalToSwagger encodes first class object
func (obj *TaxTransaction) MarshalToSwagger() *ops_models.TaxTransaction {
return &ops_models.TaxTransaction{
ID: obj.ID,

View File

@ -8,6 +8,7 @@ import (
"github.com/google/uuid"
)
// UnMarshalTaxTypeAccount encodes first class object
func UnMarshalTaxTypeAccount(s *regs_models.TaxTypeAccount) *TaxTypeAccount {
if s.ID == "" {
s.ID = uuid.New().String()
@ -64,6 +65,8 @@ func UnMarshalTaxTypeAccount(s *regs_models.TaxTypeAccount) *TaxTypeAccount {
},
}
}
// MarshalToSwagger encodes first class object
func (obj *TaxTypeAccount) MarshalToSwagger() *regs_models.TaxTypeAccount {
return &regs_models.TaxTypeAccount{
ID: obj.ID,

View File

@ -2,6 +2,7 @@ package app
import "code.tnxs.net/taxnexus/lib/api/devops/devops_models"
// UnMarshalTenantUser encodes first class object
func UnMarshalTenantUser(s *devops_models.TenantUser) *TenantUser {
return &TenantUser{
AccessLevel: s.AccessLevel,
@ -22,6 +23,8 @@ func UnMarshalTenantUser(s *devops_models.TenantUser) *TenantUser {
Username: s.Username,
}
}
// MarshalToSwagger encodes first class object
func (obj *TenantUser) MarshalToSwagger() *devops_models.TenantUser {
return &devops_models.TenantUser{
AccessLevel: obj.AccessLevel,

View File

@ -2,6 +2,7 @@ package app
import "code.tnxs.net/taxnexus/lib/api/ops/ops_models"
// MarshalToSwagger encodes first class object
func (obj *Total) MarshalToSwagger() *ops_models.Total {
var items []*ops_models.TotalItem
if obj.TotalItems != nil {

View File

@ -7,6 +7,7 @@ import (
"code.tnxs.net/taxnexus/lib/api/regs/regs_models"
)
// UnMarshalTransaction encodes first class object
func UnMarshalTransaction(s *regs_models.Transaction) *Transaction {
createdDate, e0 := time.Parse(dateTimeFormat, s.CreatedDate)
lastModfiedDate, e1 := time.Parse(dateTimeFormat, s.LastModifiedDate)
@ -29,6 +30,8 @@ func UnMarshalTransaction(s *regs_models.Transaction) *Transaction {
},
}
}
// MarshalToSwagger encodes first class object
func (obj *Transaction) MarshalToSwagger() *regs_models.Transaction {
return &regs_models.Transaction{
ID: obj.ID,

31
app/userauth.go Normal file
View File

@ -0,0 +1,31 @@
package app
// UserAuth is a first class object type
type UserAuth struct {
AccountID string
APIKey string
ContactID string
Email string
Roles []string
Tenants []string
UserID string
}
// NewAuth0User is a first class object type
type NewAuth0User struct {
Blocked bool `json:"blocked,omitempty"`
Connection string `json:"connection,omitempty"`
Email string `json:"email,omitempty"`
EmailVerified bool `json:"email_verified,omitempty"`
FamilyName string `json:"family_name,omitempty"`
GivenName string `json:"given_name,omitempty"`
Name string `json:"name,omitempty"`
Nickname string `json:"nickname,omitempty"`
Password string `json:"password,omitempty"`
PhoneNumber string `json:"phone_number,omitempty"`
PhoneVerified bool `json:"phone_verified,omitempty"`
Picture string `json:"picture,omitempty"`
UserID string `json:"user_id,omitempty"`
Username string `json:"username,omitempty"`
VerifyEmail bool `json:"verify_email,omitempty"`
}

View File

@ -0,0 +1 @@
package app

View File

@ -7,7 +7,10 @@ import (
"go.temporal.io/sdk/workflow"
)
// StoreAccountActivity posts a new lead object to datastore
// StoreAccountActivityID is an activity identifier
const StoreAccountActivityID = "STORE_ACCOUNT_ACTIVITY"
// StoreAccountActivity posts a new account object to datastore
func StoreAccountActivity(ctx workflow.Context, w app.AccountChannelWrapper) error { //nolint:gocritic // what we want
postAccountParams := accounts.NewPostAccountsParamsWithTimeout(postTimeout)
postAccountParams.AccountRequest = &crm_models.AccountRequest{
@ -17,6 +20,6 @@ func StoreAccountActivity(ctx workflow.Context, w app.AccountChannelWrapper) err
if err != nil {
return err
}
sugar.Info("crm.storeAccount: 👍 📤")
sugar.Info("rules.StoreAccountActivity: 👍 📤")
return nil
}

61
rules/auth0.go Normal file
View File

@ -0,0 +1,61 @@
package rules
import (
"fmt"
"code.tnxs.net/taxnexus/lib/api/devops/devops_client/user"
"code.tnxs.net/taxnexus/lib/api/devops/devops_models"
"code.tnxs.net/taxnexus/lib/api/workflow/workflow_client/outgoing_email_message"
"code.tnxs.net/taxnexus/lib/api/workflow/workflow_models"
"code.tnxs.net/taxnexus/lib/app"
"go.temporal.io/sdk/workflow"
)
// StoreAuth0UserActivity creates a new Auth0 user tied to a User record
func StoreAuth0UserActivity(ctx workflow.Context, w app.UserChannelWrapper) error {
auth0UserID, err := app.GetAuth0UserByEmail(w.Obj.Email)
if err != nil {
return err
}
if auth0UserID != "not found" {
return fmt.Errorf("rules.StoreAuth0UserActivity: 💣 ⛔ Auth0 user exists: %s", auth0UserID)
}
newAuth0UserID, err := app.CreateNewAuth0User(&app.NewAuth0User{})
if err != nil {
return err
}
putUser := w.Obj
putUser.Auth0UserID = newAuth0UserID
//
// update Taxnexus user
//
putUserParams := user.NewPutUsersParamsWithTimeout(getTimeout)
putUserParams.UserRequest = &devops_models.UserRequest{
Data: []*devops_models.User{&putUser},
}
_, err = devopsClient.User.PutUsers(putUserParams, w.Principal.Auth)
if err != nil {
return err
}
//
// send emails
//
emailParams := outgoing_email_message.NewPostOutgoingEmailMessagesParamsWithTimeout(postTimeout)
emailParams.OutgoingEmailMessageRequest = &workflow_models.OutgoingEmailMessageRequest{
Data: []*workflow_models.OutgoingEmailMessage{
{
Subject: putUser.ID,
},
},
}
_, err = workflowClient.
OutgoingEmailMessage.
PostOutgoingEmailMessages(
emailParams,
w.Principal.Auth,
)
if err != nil {
return err
}
return nil
}

1
rules/new-tenant.go Normal file
View File

@ -0,0 +1 @@
package rules

1
rules/new-tenantuser.go Normal file
View File

@ -0,0 +1 @@
package rules

46
rules/new-user.go Normal file
View File

@ -0,0 +1,46 @@
package rules
import (
"time"
"code.tnxs.net/taxnexus/lib/api/devops/devops_models"
"code.tnxs.net/taxnexus/lib/app"
"go.temporal.io/sdk/workflow"
)
// NewUserChannelWrapper wraps a contact, account, payment method and a user identifier (app.User)
type NewUserChannelWrapper struct {
User devops_models.User
Principal app.User
SagaID string
SagaType string
}
// NewUserWorkflow is a Temporal workflow
func NewUserWorkflow(ctx workflow.Context, payload *NewUserChannelWrapper) error {
ctx = workflow.WithActivityOptions(
ctx,
workflow.ActivityOptions{
StartToCloseTimeout: time.Minute,
})
err := workflow.ExecuteActivity(ctx,
StoreUserActivity,
&app.UserChannelWrapper{
Obj: payload.User,
Principal: payload.Principal,
SagaID: payload.SagaID,
SagaType: payload.SagaType,
}).Get(ctx, nil)
if err != nil {
return err
}
err = workflow.ExecuteActivity(
ctx,
NotifyLeadActivity,
payload,
).Get(ctx, nil)
if err != nil {
return err
}
return nil
}

View File

@ -5,6 +5,7 @@ import (
"time"
"code.tnxs.net/taxnexus/lib/api/crm/crm_client"
"code.tnxs.net/taxnexus/lib/api/devops/devops_client"
"code.tnxs.net/taxnexus/lib/api/ops/ops_client"
"code.tnxs.net/taxnexus/lib/api/workflow/workflow_client"
"code.tnxs.net/taxnexus/lib/app"
@ -14,13 +15,15 @@ import (
)
// const dateFormat = "2006-01-02"
// const getTimeout = 6 * time.Minute
const getTimeout = 6 * time.Minute
// const dateTimeFormat = "2006-01-02T15:04:05-0800"
const postTimeout = 6 * time.Minute
var sugar = logger.New(zapcore.InfoLevel)
var crmClient = crm_client.Default
var devopsClient = devops_client.Default
var opsClient = ops_client.Default
var workflowClient = workflow_client.Default

116
rules/user.go Normal file
View File

@ -0,0 +1,116 @@
package rules
import (
"bytes"
"context"
"fmt"
"html/template"
"code.tnxs.net/taxnexus/lib/api/devops/devops_client/user"
"code.tnxs.net/taxnexus/lib/api/devops/devops_models"
"code.tnxs.net/taxnexus/lib/api/workflow/workflow_client/outgoing_email_message"
"code.tnxs.net/taxnexus/lib/api/workflow/workflow_models"
"code.tnxs.net/taxnexus/lib/app"
"go.temporal.io/sdk/workflow"
)
// StoreUserActivity posts a new user object to datastore and creates the auth0 user
func StoreUserActivity(ctx workflow.Context, w app.UserChannelWrapper) error { //nolint:gocritic // what we want
postUserParams := user.NewPostUsersParamsWithTimeout(postTimeout)
if w.Obj.Name == "" {
w.Obj.Name = w.Obj.FirstName + " " + w.Obj.LastName
}
postUserParams.UserRequest = &devops_models.UserRequest{
Data: []*devops_models.User{&w.Obj},
}
devopsResponse, err := devopsClient.User.PostUsers(postUserParams, w.Principal.Auth)
if err != nil {
return err
}
var newUser *devops_models.User
for _, itm := range devopsResponse.Payload.Data { // single iteration execution
newUser = itm
}
//
// create new Auth0 user
//
auth0UserID, err := app.GetAuth0UserByEmail(newUser.Email)
if err != nil {
return err
}
if auth0UserID != "not found" {
return fmt.Errorf("app.StoreUserActivity: 💣 ⛔ Auth0 user exists: %s", auth0UserID)
}
newAuth0UserID, err := app.CreateNewAuth0User(&app.NewAuth0User{
Email: newUser.Email,
EmailVerified: true,
Name: newUser.Name,
UserID: newUser.ID,
Username: newUser.Email,
FamilyName: newUser.LastName,
GivenName: newUser.FirstName,
})
if err != nil {
return err
}
newUser.Auth0UserID = newAuth0UserID
//
// update Taxnexus user
//
putUserParams := user.NewPutUsersParamsWithTimeout(getTimeout)
putUserParams.UserRequest = &devops_models.UserRequest{
Data: []*devops_models.User{newUser},
}
_, err = devopsClient.User.PutUsers(putUserParams, w.Principal.Auth)
if err != nil {
return err
}
//
// send emails
//
sugar.Info("crm.storeUser: 👍 📤")
return nil
}
// NotifyUserActivity sends an email to a new lead
func NotifyUserActivity(ctx context.Context, w *app.UserChannelWrapper) error {
sugar.Info("workflow.notifyUser: 📥")
var buf bytes.Buffer
const textBody = `
Alert! New User Inquiry from Taxnexus.io website.
Taxnexus ID: {{.ID}}
First Name: {{.FirstName}}
Last Name: {{.LastName}}
Email: {{.Email}}
Message: {{.Description}}
-- end --
`
t := template.Must(template.New("textBody").Parse(textBody))
err := t.Execute(&buf, w)
if err != nil {
return err
}
emailParams := outgoing_email_message.NewPostOutgoingEmailMessagesParamsWithTimeout(postTimeout)
emailParams.OutgoingEmailMessageRequest = &workflow_models.OutgoingEmailMessageRequest{
Data: []*workflow_models.OutgoingEmailMessage{
{
Subject: "New lead from " + w.Obj.Name,
ValidatedFromAddress: "support@taxnexus.net",
ToAddress: "info@taxnexus.net",
FromName: "Taxnexus Onboarding",
Text: buf.String(),
HTML: "<pre>" + buf.String() + "</pre>",
},
},
}
_, err = workflowClient.OutgoingEmailMessage.PostOutgoingEmailMessages(emailParams, w.Principal.Auth)
if err != nil {
return err
}
sugar.Info("workflow.notifyUser: 👍 📤")
return nil
}