Files
alfred-be/alfred/mapper/sessionsMapper.go
2026-03-08 16:14:42 +05:30

118 lines
3.6 KiB
Go

package mapper
import (
"alfred/config"
"alfred/model/common"
"alfred/model/es"
"alfred/pkg/log"
"alfred/utils"
"encoding/json"
"github.com/elastic/go-elasticsearch/v8/esapi"
"go.uber.org/zap"
)
func MapEsResponseToSessionResponse(search *esapi.Response) ([]es.SessionResponse, error) {
result, err := MapESApiResponseToESResponse(search)
if err != nil {
return nil, err
}
if len(result.Hits.Hits) == 0 {
return []es.SessionResponse{}, &common.InvalidSessionError{}
}
//fetching sessionId, deviceId and event timestamp from es response.
var sessionResponse []es.SessionResponse
jsonHits, err := json.Marshal(result.Hits.Hits)
if err != nil {
return nil, err
}
if err = json.Unmarshal(jsonHits, &sessionResponse); err != nil {
return nil, err
}
for idx := range sessionResponse {
if sessionResponse[idx].Source.BaseAttributes.ImageType == utils.EMPTY {
sessionResponse[idx].Source.BaseAttributes.ImageType = utils.ImageTypeJpeg
}
if sessionResponse[idx].Source.BaseAttributes.FileTypeExtension == utils.EMPTY {
sessionResponse[idx].Source.BaseAttributes.FileTypeExtension = utils.ZipExtension.String()
}
}
return sessionResponse, nil
}
func MapEsResponseToSessionWithDurationResponse(search *esapi.Response) ([]es.SessionResponse, error) {
defer search.Body.Close()
var result es.SessionEsResponse
err := json.NewDecoder(search.Body).Decode(&result)
if err != nil {
return nil, err
}
if len(result.Hits.Hits) == 0 {
return []es.SessionResponse{}, &common.InvalidSessionError{}
}
//fetching sessionId, deviceId and event timestamp from es response.
var sessionResponse []es.SessionResponse
jsonHits, err := json.Marshal(result.Hits.Hits)
if err != nil {
log.Error("Error while marshalling app session", zap.Error(err))
return nil, err
}
if err = json.Unmarshal(jsonHits, &sessionResponse); err != nil {
log.Error("Error while unmarshalling app session", zap.Error(err))
return nil, err
}
var finalSessionResponse []es.SessionResponse
for _, value := range result.Aggregations.Buckets.Buckets {
localValue := value
for _, session := range sessionResponse {
if session.Source.BaseAttributes.SessionId == value.Key {
var diff int64
if localValue.MaxTimestamp.Value == 0 {
zipUploadTime := config.GetCoreConfig().ZipUploadTimeConfig
diff = int64(localValue.MaxClientTimestamp.Value+zipUploadTime-localValue.MinTimestamp.Value) / 1000
} else {
diff = int64(localValue.MaxTimestamp.Value-localValue.MinTimestamp.Value) / 1000
}
session.SessionDuration = &diff
finalSessionResponse = append(finalSessionResponse, session)
}
}
}
return finalSessionResponse, nil
}
func MapEsResponseToSessionResponseForAllSessions(search *esapi.Response) ([]es.SessionResponse, error) {
result, err := MapESApiResponseToESResponse(search)
if err != nil {
return nil, err
}
if len(result.Hits.Hits) == 0 {
return []es.SessionResponse{}, &common.InvalidSessionError{}
}
//fetching sessionId, deviceId and event timestamp from es response.
var sessionResponse []es.SessionResponse
jsonHits, err := json.Marshal(result.Hits.Hits)
if err != nil {
return nil, err
}
if err = json.Unmarshal(jsonHits, &sessionResponse); err != nil {
return nil, err
}
return sessionResponse, nil
}
func MapEsApiResponseToSessionDeviceAttributesResponse(search *esapi.Response) (*es.SessionEsResponseForDeviceAttributes, error) {
defer search.Body.Close()
var esResponse es.SessionEsResponseForDeviceAttributes
err := json.NewDecoder(search.Body).Decode(&esResponse)
if err != nil {
return nil, err
}
return &esResponse, nil
}