Skip to content

Commit

Permalink
feat: Connect teams with contacts and subscriptions
Browse files Browse the repository at this point in the history
In this commit implemented handlers for teams that allow create contacts
and subscriptions.

Relates #230
  • Loading branch information
litleleprikon committed Mar 26, 2021
1 parent 5152a72 commit 64c87e5
Show file tree
Hide file tree
Showing 30 changed files with 1,805 additions and 422 deletions.
47 changes: 37 additions & 10 deletions api/controller/contact.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,10 +27,14 @@ func GetAllContacts(database moira.Database) (*dto.ContactList, *api.ErrorRespon
}

// CreateContact creates new notification contact for current user
func CreateContact(dataBase moira.Database, contact *dto.Contact, userLogin string) *api.ErrorResponse {
func CreateContact(dataBase moira.Database, contact *dto.Contact, userLogin, teamID string) *api.ErrorResponse {
if userLogin != "" && teamID != "" {
return api.ErrorInternalServer(fmt.Errorf("CreateContact: cannot create contact when both userLogin and teamID specified"))
}
contactData := moira.ContactData{
ID: contact.ID,
User: userLogin,
Team: teamID,
Type: contact.Type,
Value: contact.Value,
}
Expand All @@ -55,6 +59,7 @@ func CreateContact(dataBase moira.Database, contact *dto.Contact, userLogin stri
}
contact.User = userLogin
contact.ID = contactData.ID
contact.Team = contactData.Team
return nil
}

Expand All @@ -66,15 +71,28 @@ func UpdateContact(dataBase moira.Database, contactDTO dto.Contact, contactData
return contactDTO, api.ErrorInternalServer(err)
}
contactDTO.User = contactData.User
contactDTO.Team = contactData.Team
contactDTO.ID = contactData.ID
return contactDTO, nil
}

// RemoveContact deletes notification contact for current user and remove contactID from all subscriptions
func RemoveContact(database moira.Database, contactID string, userLogin string) *api.ErrorResponse {
subscriptionIDs, err := database.GetUserSubscriptionIDs(userLogin)
if err != nil {
return api.ErrorInternalServer(err)
func RemoveContact(database moira.Database, contactID string, userLogin string, teamID string) *api.ErrorResponse { //nolint:gocyclo
subscriptionIDs := []string{}
if userLogin != "" {
userSubscriptionIDs, err := database.GetUserSubscriptionIDs(userLogin)
if err != nil {
return api.ErrorInternalServer(err)
}
subscriptionIDs = append(subscriptionIDs, userSubscriptionIDs...)
}

if teamID != "" {
teamSubscriptionIDs, err := database.GetTeamSubscriptionIDs(teamID)
if err != nil {
return api.ErrorInternalServer(err)
}
subscriptionIDs = append(subscriptionIDs, teamSubscriptionIDs...)
}

subscriptions, err := database.GetSubscriptions(subscriptionIDs)
Expand Down Expand Up @@ -144,14 +162,23 @@ func CheckUserPermissionsForContact(dataBase moira.Database, contactID string, u
contactData, err := dataBase.GetContact(contactID)
if err != nil {
if err == database.ErrNil {
return contactData, api.ErrorNotFound(fmt.Sprintf("contact with ID '%s' does not exists", contactID))
return moira.ContactData{}, api.ErrorNotFound(fmt.Sprintf("contact with ID '%s' does not exists", contactID))
}
return moira.ContactData{}, api.ErrorInternalServer(err)
}
if contactData.Team != "" {
teamContainsUser, err := dataBase.IsTeamContainUser(contactData.Team, userLogin)
if err != nil {
return moira.ContactData{}, api.ErrorInternalServer(err)
}
if teamContainsUser {
return contactData, nil
}
return contactData, api.ErrorInternalServer(err)
}
if contactData.User != userLogin {
return contactData, api.ErrorForbidden("you are not permitted")
if contactData.User == userLogin {
return contactData, nil
}
return contactData, nil
return moira.ContactData{}, api.ErrorForbidden("you are not permitted")
}

func isContactExists(dataBase moira.Database, contactID string) (bool, error) {
Expand Down

0 comments on commit 64c87e5

Please sign in to comment.