Files
houston-be/service/user/upsert_users.go
Shivam Handa bcbbd2b44f NTP-13111 | log (#484)
* 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
2025-03-07 13:35:15 +05:30

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"