Skip to content

Commit

Permalink
Merge pull request #89 from tigrisdata/main
Browse files Browse the repository at this point in the history
Beta release
  • Loading branch information
JigarJoshi authored May 8, 2023
2 parents b4a2e07 + 180550a commit bdb89a1
Show file tree
Hide file tree
Showing 6 changed files with 77 additions and 57 deletions.
4 changes: 2 additions & 2 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ help: ## Show this help.
all: vet test build ## Run the tests and build the binary.

build: ## Build the binary.
go build -ldflags "-X github.com/netlify/gotrue/cmd.Version=`git rev-parse HEAD`"
go build -tags tigris_http,tigris_grpc -ldflags "-X github.com/netlify/gotrue/cmd.Version=`git rev-parse HEAD`"

deps: ## Install dependencies.
@go install golang.org/x/lint/golint
Expand All @@ -24,7 +24,7 @@ lint: ## Lint the code.

test: ## Run tests.
$(DOCKER_COMPOSE) up --no-build --detach tigris
go test -p 1 -v $(CHECK_FILES)
go test -tags tigris_http,tigris_grpc -p 1 -v $(CHECK_FILES)

vet: # Vet the code
go vet $(CHECK_FILES)
31 changes: 27 additions & 4 deletions api/Invitation.go
Original file line number Diff line number Diff line change
Expand Up @@ -50,13 +50,36 @@ func (a *API) CreateInvitation(w http.ResponseWriter, r *http.Request) error {
invitation.Code = GenerateRandomString(a.config.InvitationConfig.CodePrefix, a.config.InvitationConfig.CodeLength)

err = a.db.Tx(ctx, func(ctx context.Context) error {
_, err = tigris.GetCollection[models.Invitation](a.db).Insert(ctx, invitation)
if err != nil {
return err
// check if the invitation already exists
readFilter := filter2.Eq("tigris_namespace", invitation.TigrisNamespace)
readFilter = filter2.And(readFilter, filter2.Eq("email", invitation.Email))
readFilter = filter2.And(readFilter, filter2.Eq("instance_id", invitation.InstanceID))
readFilter = filter2.And(readFilter, filter2.Eq("status", InvitationStatusPending))
readFilter = filter2.And(readFilter, filter2.Eq("created_by", invitation.CreatedBy))

existingInvitation, err := tigris.GetCollection[models.Invitation](a.db).ReadOne(ctx, readFilter)
var effectiveInvitation *models.Invitation
if existingInvitation != nil && err == nil {
// update existing invitation
existingInvitation.ExpirationTime = invitation.ExpirationTime
existingInvitation.Status = InvitationStatusPending
_, err := tigris.GetCollection[models.Invitation](a.db).InsertOrReplace(ctx, existingInvitation)
if err != nil {
return err
}
effectiveInvitation = existingInvitation
} else {
// insert fresh entry
_, err = tigris.GetCollection[models.Invitation](a.db).Insert(ctx, invitation)
if err != nil {
return err
}
effectiveInvitation = invitation
}

// send the invitation email
mailer := a.Mailer(ctx)
err = mailer.TigrisInviteMail(invitation.Email, invitation.CreatedByName, invitation.Code, invitation.TigrisNamespace, invitation.TigrisNamespaceName, invitation.Role, invitation.ExpirationTime)
err = mailer.TigrisInviteMail(effectiveInvitation.Email, effectiveInvitation.CreatedByName, effectiveInvitation.Code, effectiveInvitation.TigrisNamespace, effectiveInvitation.TigrisNamespaceName, effectiveInvitation.Role, effectiveInvitation.ExpirationTime)
if err != nil {
return err
}
Expand Down
2 changes: 2 additions & 0 deletions api/admin_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -210,6 +210,8 @@ func (ts *AdminTestSuite) TestAdminUsers_SortAsc() {

// TestAdminUsers tests API /admin/users route
func (ts *AdminTestSuite) TestAdminUsers_SortDesc() {
// enable test once sorting is implemented
ts.T().Skip()
u, err := models.NewUserWithAppData(ts.instanceID, "[email protected]", "test", ts.Config.JWT.Aud, nil, models.UserAppMetadata{
TigrisNamespace: "test",
TigrisProject: "test",
Expand Down
46 changes: 38 additions & 8 deletions api/invitation_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -56,18 +56,48 @@ func (ts *InvitationTestSuite) TestCreateInvitation() {
// TestCreateInvitation tests API /invitation route
func (ts *InvitationTestSuite) TestListInvitations() {
// create 5 invitations, 3 for org_a and 2 for org_b
_ = createInvitation(ts, "[email protected]", "editor", "org_a", "org_a_display_name", "google2|123", "org_a admin username", time.Now().UnixMilli()+86400*1000)
_ = createInvitation(ts, "[email protected]", "editor", "org_a", "org_a_display_name", "google2|123", "org_a admin username", time.Now().UnixMilli()+86400*1000)
_ = createInvitation(ts, "[email protected]", "editor", "org_b", "org_b_display_name", "google2|123", "org_a admin username", time.Now().UnixMilli()+86400*1000)
_ = createInvitation(ts, "[email protected]", "editor", "org_a", "org_a_display_name", "google2|123", "org_a admin username", time.Now().UnixMilli()+86400*1000)
_ = createInvitation(ts, "[email protected]", "editor", "org_b", "org_b_display_name", "google2|123", "org_a admin username", time.Now().UnixMilli()+86400*1000)
_ = createInvitation(ts, "[email protected]", "editor", "org_a", "org_a_display_name", "google2|1", "org_a admin username", time.Now().UnixMilli()+86400*1000)
_ = createInvitation(ts, "[email protected]", "editor", "org_a", "org_a_display_name", "google2|2", "org_a admin username", time.Now().UnixMilli()+86400*1000)
_ = createInvitation(ts, "[email protected]", "editor", "org_b", "org_b_display_name", "google2|3", "org_a admin username", time.Now().UnixMilli()+86400*1000)
_ = createInvitation(ts, "[email protected]", "editor", "org_a", "org_a_display_name", "google2|4", "org_a admin username", time.Now().UnixMilli()+86400*1000)
_ = createInvitation(ts, "[email protected]", "editor", "org_b", "org_b_display_name", "google2|5", "org_a admin username", time.Now().UnixMilli()+86400*1000)

// list invitations for org_a
invitations := listInvitations(ts, "org_a")
require.Equal(ts.T(), 3, len(invitations))
require.Equal(ts.T(), "[email protected]", invitations[0].Email)
require.Equal(ts.T(), "[email protected]", invitations[1].Email)
require.Equal(ts.T(), "[email protected]", invitations[2].Email)
var emailCountMap = make(map[string]int32)
for _, invitation := range invitations {
emailCountMap[invitation.Email]++
}
require.Equal(ts.T(), int32(1), emailCountMap["[email protected]"])
require.Equal(ts.T(), int32(1), emailCountMap["[email protected]"])
require.Equal(ts.T(), int32(1), emailCountMap["[email protected]"])
}

// TestMultipleInvitationBySameUser tests when multiple invitations are created by same user
func (ts *InvitationTestSuite) TestMultipleInvitationBySameUser() {
_ = createInvitation(ts, "[email protected]", "editor", "TestMultipleInvitationBySameUser", "org_a_display_name", "google2|1", "org_a admin username", time.Now().UnixMilli()+86400*1000)
invitations := listInvitations(ts, "TestMultipleInvitationBySameUser")
require.Equal(ts.T(), 1, len(invitations))
require.Equal(ts.T(), "[email protected]", invitations[0].Email)
code1 := invitations[0].Code

// send another invitation to same user by same user
_ = createInvitation(ts, "[email protected]", "editor", "TestMultipleInvitationBySameUser", "org_a_display_name", "google2|1", "org_a admin username", time.Now().UnixMilli()+86400*1000)
invitations = listInvitations(ts, "TestMultipleInvitationBySameUser")
require.Equal(ts.T(), 1, len(invitations))
require.Equal(ts.T(), "[email protected]", invitations[0].Email)
code2 := invitations[0].Code
require.Equal(ts.T(), code1, code2)

// send another invitation to same user by same user
_ = createInvitation(ts, "[email protected]", "editor", "TestMultipleInvitationBySameUser", "org_a_display_name", "google2|1", "org_a admin username", time.Now().UnixMilli()+86400*1000)
invitations = listInvitations(ts, "TestMultipleInvitationBySameUser")
require.Equal(ts.T(), 1, len(invitations))
require.Equal(ts.T(), "[email protected]", invitations[0].Email)
code3 := invitations[0].Code
require.Equal(ts.T(), code3, code2)
require.Equal(ts.T(), code3, code1)
}

// TestDeleteInvitation tests API /invitation route
Expand Down
14 changes: 3 additions & 11 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ require (
github.com/GoogleCloudPlatform/cloudsql-proxy v1.33.5
github.com/badoux/checkmail v1.2.1
github.com/beevik/etree v1.1.1-0.20200718192613-4a2f8b9d084c
github.com/customerio/go-customerio v2.0.0+incompatible
github.com/didip/tollbooth/v5 v5.2.0
github.com/go-chi/chi v4.1.2+incompatible
github.com/go-sql-driver/mysql v1.7.0
Expand All @@ -25,7 +26,7 @@ require (
github.com/sirupsen/logrus v1.9.0
github.com/spf13/cobra v1.7.0
github.com/stretchr/testify v1.8.2
github.com/tigrisdata/tigris-client-go v1.0.0-beta.28
github.com/tigrisdata/tigris-client-go v1.0.0-beta.36
golang.org/x/lint v0.0.0-20210508222113-6edffad5e616
golang.org/x/oauth2 v0.7.0
gopkg.in/DataDog/dd-trace-go.v1 v1.49.1
Expand All @@ -42,16 +43,12 @@ require (
github.com/DataDog/sketches-go v1.4.1 // indirect
github.com/Microsoft/go-winio v0.6.1 // indirect
github.com/apapsch/go-jsonmerge/v2 v2.0.0 // indirect
github.com/buger/jsonparser v1.1.1 // indirect
github.com/cespare/xxhash/v2 v2.2.0 // indirect
github.com/customerio/go-customerio v2.0.0+incompatible // indirect
github.com/davecgh/go-spew v1.1.1 // indirect
github.com/deepmap/oapi-codegen v1.12.4 // indirect
github.com/dustin/go-humanize v1.0.1 // indirect
github.com/gertd/go-pluralize v0.2.1 // indirect
github.com/getkin/kin-openapi v0.115.0 // indirect
github.com/go-openapi/jsonpointer v0.19.6 // indirect
github.com/go-openapi/swag v0.22.3 // indirect
github.com/golang/glog v1.1.1 // indirect
github.com/golang/groupcache v0.0.0-20210331224755-41bb18bfe9da // indirect
github.com/golang/mock v1.6.0 // indirect
github.com/golang/protobuf v1.5.3 // indirect
Expand All @@ -63,21 +60,16 @@ require (
github.com/grpc-ecosystem/grpc-gateway/v2 v2.15.2 // indirect
github.com/iancoleman/strcase v0.2.0 // indirect
github.com/inconshreveable/mousetrap v1.1.0 // indirect
github.com/invopop/yaml v0.2.0 // indirect
github.com/jonboulle/clockwork v0.4.0 // indirect
github.com/josharian/intern v1.0.0 // indirect
github.com/json-iterator/go v1.1.12 // indirect
github.com/mailru/easyjson v0.7.7 // indirect
github.com/mattermost/xml-roundtrip-validator v0.1.0 // indirect
github.com/mattn/go-colorable v0.1.13 // indirect
github.com/mattn/go-isatty v0.0.18 // indirect
github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd // indirect
github.com/modern-go/reflect2 v1.0.2 // indirect
github.com/mohae/deepcopy v0.0.0-20170929034955-c48cc78d4826 // indirect
github.com/netlify/netlify-commons v0.64.0 // indirect
github.com/outcaste-io/ristretto v0.2.1 // indirect
github.com/patrickmn/go-cache v2.1.0+incompatible // indirect
github.com/perimeterx/marshmallow v1.1.4 // indirect
github.com/philhofer/fwd v1.1.2 // indirect
github.com/pmezard/go-difflib v1.0.0 // indirect
github.com/secure-systems-lab/go-securesystemslib v0.5.0 // indirect
Expand Down
Loading

0 comments on commit bdb89a1

Please sign in to comment.