* NTP-13111 | logs added * NTP-13111 | app_name changed to tracker_app_name * NTP-13111 | log added for user event change monitoring * NTP-13111 | log added for user event change monitoring * NTP-13111 | logs added
104 lines
3.5 KiB
Go
104 lines
3.5 KiB
Go
package user
|
|
|
|
import (
|
|
"fmt"
|
|
"github.com/slack-go/slack"
|
|
"go.uber.org/zap"
|
|
"houston/common/metrics"
|
|
"houston/logger"
|
|
userModel "houston/model/user"
|
|
)
|
|
|
|
const upsertUsersLogTag = "[upsert-users]"
|
|
|
|
func (service *userServiceImpl) UpsertUsers() {
|
|
logger.Info(fmt.Sprintf("%s received request for upserting users", upsertUsersLogTag))
|
|
|
|
go func() {
|
|
slackUsers, err := service.slackService.GetAllUsers()
|
|
if err != nil {
|
|
logger.Error(fmt.Sprintf("%s error in fetching slack users", upsertUsersLogTag), zap.Error(err))
|
|
metrics.PublishHoustonFlowFailureMetrics(flowName, err.Error())
|
|
return
|
|
}
|
|
|
|
houstonUsers, err := service.userRepository.GetAllHoustonUsers()
|
|
if err != nil {
|
|
logger.Error(fmt.Sprintf("%s error in fetching houston users", upsertUsersLogTag), zap.Error(err))
|
|
metrics.PublishHoustonFlowFailureMetrics(flowName, err.Error())
|
|
return
|
|
}
|
|
|
|
slackIdToUserDataMap := service.createSlackIdToUserDataMap(slackUsers)
|
|
slackIdToHoustonUserDataMap := service.createSlackIdToHoustonUserDataMap(houstonUsers)
|
|
service.processUsersMapsToUpsert(slackIdToUserDataMap, slackIdToHoustonUserDataMap)
|
|
}()
|
|
}
|
|
|
|
func (service *userServiceImpl) processUsersMapsToUpsert(slackIdToUserDataMap, slackIdToHoustonUserDataMap map[string]userModel.UserEntity) error {
|
|
usersToInsert := make([]userModel.UserEntity, 0)
|
|
usersToUpdate := make([]userModel.UserEntity, 0)
|
|
|
|
for id, slackUser := range slackIdToUserDataMap {
|
|
if _, userExists := slackIdToHoustonUserDataMap[id]; !userExists {
|
|
logger.Info(fmt.Sprintf("%s new user found with slack id %s and name %s", upsertUsersLogTag, id, slackUser.Name))
|
|
usersToInsert = append(usersToInsert, slackUser)
|
|
} else {
|
|
dbUser := slackIdToHoustonUserDataMap[id]
|
|
logger.Info(fmt.Sprintf("%s found user %s in houston to update with cron", upsertUsersLogTag, slackUser.Email))
|
|
updatedUser, needsUpdate := dbUser.Update(slackUser)
|
|
if needsUpdate {
|
|
logger.Info(fmt.Sprintf("%s user %s needs update", upsertUsersLogTag, updatedUser.Name))
|
|
usersToUpdate = append(usersToUpdate, updatedUser)
|
|
}
|
|
}
|
|
}
|
|
|
|
logger.Info(fmt.Sprintf("%s found %d users to insert and %d users to update",
|
|
upsertUsersLogTag, len(usersToInsert), len(usersToUpdate)))
|
|
|
|
if len(usersToInsert) > 0 {
|
|
err := service.userRepository.Insert(usersToInsert)
|
|
if err != nil {
|
|
logger.Error(fmt.Sprintf("%s error in inserting users", upsertUsersLogTag), zap.Error(err))
|
|
return err
|
|
}
|
|
}
|
|
|
|
if len(usersToUpdate) > 0 {
|
|
err := service.userRepository.Update(usersToUpdate)
|
|
if err != nil {
|
|
logger.Error(fmt.Sprintf("%s error in updating users", upsertUsersLogTag), zap.Error(err))
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (service *userServiceImpl) createSlackIdToUserDataMap(slackUsers []slack.User) map[string]userModel.UserEntity {
|
|
slackIdToUserDataMap := make(map[string]userModel.UserEntity)
|
|
for _, userData := range slackUsers {
|
|
slackIdToUserDataMap[userData.ID] = userModel.UserEntity{
|
|
Name: userData.Name,
|
|
SlackUserId: userData.ID,
|
|
Active: !userData.Deleted,
|
|
IsBot: userData.IsBot,
|
|
Email: userData.Profile.Email,
|
|
Image: userData.Profile.Image32,
|
|
RealName: userData.Profile.RealName,
|
|
}
|
|
}
|
|
return slackIdToUserDataMap
|
|
}
|
|
|
|
func (service *userServiceImpl) createSlackIdToHoustonUserDataMap(houstonUsers *[]userModel.UserEntity) map[string]userModel.UserEntity {
|
|
slackIdToHoustonUserDataMap := make(map[string]userModel.UserEntity)
|
|
for _, user := range *houstonUsers {
|
|
slackIdToHoustonUserDataMap[user.SlackUserId] = user
|
|
}
|
|
return slackIdToHoustonUserDataMap
|
|
}
|
|
|
|
const flowName = "UPSERT_USERS"
|