diff --git a/api/routes.go b/api/routes.go index 8e246329..8199b257 100644 --- a/api/routes.go +++ b/api/routes.go @@ -38,6 +38,8 @@ func AddRoutes(r *mux.Router) { review_task := resource.ReviewTask(r) r.Handle("/review-task", authenticatedHandlerJSON(review_task.List)).Methods("GET") r.Handle("/service-request", auth.NewEnsureAuth(apiServiceRequest)).Methods("GET") + session := resource.Session(router) + r.Handle("/session", authenticatedHandlerJSON(session.Get)).Methods("GET").Name("session.get") signal := resource.Signal(r) r.Handle("/signal", authenticatedHandlerJSON(signal.List)).Methods("GET") r.Handle("/sudo/email", authenticatedHandlerJSONPost(postSudoEmail)).Methods("POST") diff --git a/platform/notification.go b/platform/notification.go index 0e367c17..7b815f4c 100644 --- a/platform/notification.go +++ b/platform/notification.go @@ -27,10 +27,10 @@ type Notification struct { Time time.Time Type string } -type UserNotificationCounts struct { - Communications uint `json:"communication"` - Home uint `json:"home"` - Review uint `json:"review"` +type notificationCounts struct { + Communications uint + Home uint + Review uint } // Clear all notifications for a given user with the given path @@ -105,7 +105,7 @@ func NotificationsForUser(ctx context.Context, u User) ([]Notification, error) { } return results, nil } -func NotificationCountsForUser(ctx context.Context, u User) (*UserNotificationCounts, error) { +func NotificationCountsForUser(ctx context.Context, u User) (*notificationCounts, error) { count_home, err := u.model.UserNotifications( models.SelectWhere.Notifications.ResolvedAt.IsNull(), ).Count(ctx, db.PGInstance.BobDB) @@ -125,7 +125,7 @@ func NotificationCountsForUser(ctx context.Context, u User) (*UserNotificationCo return nil, fmt.Errorf("Failed to get review notification count: %w", err) } //log.Debug().Int64("reports", count_reports).Int64("home", count_home).Int64("review", count_review).Int("user", u.ID).Msg("calculated notification counts") - return &UserNotificationCounts{ + return ¬ificationCounts{ Communications: uint(count_reports), Home: uint(count_home), Review: uint(count_review), diff --git a/platform/organization.go b/platform/organization.go index 21fa2262..6f42e3cc 100644 --- a/platform/organization.go +++ b/platform/organization.go @@ -8,12 +8,13 @@ import ( "github.com/Gleipnir-Technology/bob/dialect/psql/sm" "github.com/Gleipnir-Technology/nidus-sync/db" "github.com/Gleipnir-Technology/nidus-sync/db/models" + "github.com/Gleipnir-Technology/nidus-sync/platform/types" //"github.com/google/uuid" ) type Organization struct { - ID int32 `json:"id"` - ServiceArea *ServiceArea `json:"service_area"` + ID int32 `json:"id"` + ServiceArea *types.ServiceArea `json:"service_area"` model *models.Organization } @@ -75,11 +76,6 @@ func (o Organization) FieldseekerSyncLatest(ctx context.Context) (*models.Fields return sync, nil } -type ServiceArea struct { - Min Point `json:"min"` - Max Point `json:"max"` -} - func (o Organization) ServiceRequestRecent(ctx context.Context) ([]*models.FieldseekerServicerequest, error) { results, err := o.model.Servicerequests(sm.OrderBy("creationdate").Desc(), sm.Limit(10)).All(ctx, db.PGInstance.BobDB) if err != nil { @@ -114,19 +110,19 @@ func OrganizationList(ctx context.Context, user User) ([]*Organization, error) { return results, err } func newOrganization(org *models.Organization) Organization { - var sa *ServiceArea + var sa *types.ServiceArea if org.ServiceAreaXmax.IsValue() && org.ServiceAreaXmin.IsValue() && org.ServiceAreaYmax.IsValue() && org.ServiceAreaYmin.IsValue() { - sa = &ServiceArea{ - Min: Point{ - X: org.ServiceAreaXmin.MustGet(), - Y: org.ServiceAreaYmin.MustGet(), + sa = &types.ServiceArea{ + Min: types.Location{ + Longitude: org.ServiceAreaXmin.MustGet(), + Latitude: org.ServiceAreaYmin.MustGet(), }, - Max: Point{ - X: org.ServiceAreaXmax.MustGet(), - Y: org.ServiceAreaYmax.MustGet(), + Max: types.Location{ + Longitude: org.ServiceAreaXmax.MustGet(), + Latitude: org.ServiceAreaYmax.MustGet(), }, } } diff --git a/platform/user.go b/platform/user.go index e6afa4a4..1f1ac223 100644 --- a/platform/user.go +++ b/platform/user.go @@ -25,19 +25,17 @@ type NoUserError struct{} func (e NoUserError) Error() string { return "That user does not exist" } type User struct { - Active bool - Avatar *uuid.UUID - DisplayName string - ID int - Initials string - Notifications []Notification - NotificationCounts UserNotificationCounts - Organization Organization - PasswordHash string - PasswordHashType string - Role string - Tags []string - Username string + Active bool + Avatar *uuid.UUID + DisplayName string + ID int + Initials string + Organization Organization + PasswordHash string + PasswordHashType string + Role string + Tags []string + Username string model *models.User } @@ -55,27 +53,20 @@ func (u User) HasRoot() bool { func newUser(ctx context.Context, org Organization, user *models.User) User { avatar := user.Avatar.Ptr() u := User{ - Active: true, - Avatar: avatar, - DisplayName: user.DisplayName, - ID: int(user.ID), - Initials: extractInitials(user.DisplayName), - Notifications: []Notification{}, - NotificationCounts: UserNotificationCounts{}, - Organization: org, - PasswordHash: user.PasswordHash, - PasswordHashType: string(user.PasswordHashType), - Role: user.Role.String(), - Tags: []string{}, - Username: user.Username, + Active: true, + Avatar: avatar, + DisplayName: user.DisplayName, + ID: int(user.ID), + Initials: extractInitials(user.DisplayName), + Organization: org, + PasswordHash: user.PasswordHash, + PasswordHashType: string(user.PasswordHashType), + Role: user.Role.String(), + Tags: []string{}, + Username: user.Username, model: user, } - counts, err := NotificationCountsForUser(ctx, u) - if err != nil { - log.Error().Err(err).Int32("id", user.ID).Msg("failed to get notification counts for user") - } - u.NotificationCounts = *counts return u } @@ -272,16 +263,14 @@ func extractInitials(name string) string { } func toUser(user *models.User) User { return User{ - DisplayName: user.DisplayName, - ID: int(user.ID), - Initials: extractInitials(user.DisplayName), - Notifications: []Notification{}, - NotificationCounts: UserNotificationCounts{}, - Organization: Organization{}, - PasswordHash: user.PasswordHash, - PasswordHashType: string(user.PasswordHashType), - Role: user.Role.String(), - Username: user.Username, + DisplayName: user.DisplayName, + ID: int(user.ID), + Initials: extractInitials(user.DisplayName), + Organization: Organization{}, + PasswordHash: user.PasswordHash, + PasswordHashType: string(user.PasswordHashType), + Role: user.Role.String(), + Username: user.Username, model: user, } diff --git a/resource/user.go b/resource/user.go index e3484664..edfae233 100644 --- a/resource/user.go +++ b/resource/user.go @@ -6,9 +6,7 @@ import ( "net/http" "strconv" - "github.com/Gleipnir-Technology/nidus-sync/config" "github.com/Gleipnir-Technology/nidus-sync/db/models" - "github.com/Gleipnir-Technology/nidus-sync/html" nhttp "github.com/Gleipnir-Technology/nidus-sync/http" "github.com/Gleipnir-Technology/nidus-sync/platform" "github.com/aarondl/opt/omitnull" @@ -16,14 +14,12 @@ import ( "github.com/rs/zerolog/log" ) -type userResponse struct { - Avatar *string `json:"avatar"` - DisplayName string `json:"display_name"` - Initials string `json:"initials"` - IsActive bool `json:"is_active"` - //Notifications []Notification `json:"notifications"` - //NotificationCounts UserNotificationCounts `json:"notification_counts"` - //Organization Organization `json:"organization"` +type user struct { + Avatar *string `json:"avatar"` + DisplayName string `json:"display_name"` + ID int `json:"id"` + Initials string `json:"initials"` + IsActive bool `json:"is_active"` PasswordHash string `json:"-"` PasswordHashType string `json:"-"` Role string `json:"role"` @@ -37,7 +33,7 @@ func User(r *router) *userR { router: r, } } -func (res *userR) response(u *platform.User) (*userResponse, error) { +func (res *userR) response(u *platform.User) (*user, error) { if u == nil { return nil, fmt.Errorf("nil user") } @@ -49,9 +45,10 @@ func (res *userR) response(u *platform.User) (*userResponse, error) { if err != nil { return nil, fmt.Errorf("id to uri: %w", err) } - return &userResponse{ + return &user{ Avatar: avatar, DisplayName: u.DisplayName, + ID: int(u.ID), Initials: u.Initials, IsActive: u.Active, Role: u.Role, @@ -67,24 +64,6 @@ type userR struct { type responseListUser struct { Users []*platform.User `json:"users"` } -type contentURLAPI struct { - Avatar string `json:"avatar"` - Communication string `json:"communication"` - PublicreportMessage string `json:"publicreport_message"` - ReviewTask string `json:"review_task"` - Signal string `json:"signal"` - Upload string `json:"upload"` - User string `json:"user"` -} -type contentURLs struct { - API contentURLAPI `json:"api"` - Tegola string `json:"tegola"` - Tile string `json:"tile"` -} -type contentUserSelf struct { - Self platform.User `json:"self"` - URLs contentURLs `json:"urls"` -} func (res *userR) ByIDGet(ctx context.Context, r *http.Request, user platform.User, query QueryParams) (*platform.User, *nhttp.ErrorWithStatus) { vars := mux.Vars(r) @@ -97,8 +76,7 @@ func (res *userR) ByIDGet(ctx context.Context, r *http.Request, user platform.Us return u, nil } -func (res *userR) ByIDPut(ctx context.Context, r *http.Request, user platform.User, updates contentURLAPI) (string, *nhttp.ErrorWithStatus) { - log.Info().Str("avatar", updates.Avatar).Msg("doing updates") +func (res *userR) ByIDPut(ctx context.Context, r *http.Request, user platform.User, updates user) (string, *nhttp.ErrorWithStatus) { vars := mux.Vars(r) user_id_str := vars["id"] user_id, err := strconv.Atoi(user_id_str) @@ -106,8 +84,8 @@ func (res *userR) ByIDPut(ctx context.Context, r *http.Request, user platform.Us return "", nhttp.NewErrorStatus(http.StatusBadRequest, "user update: %w", err) } user_changes := &models.UserSetter{} - if updates.Avatar != "" { - avatar_uuid, err := res.router.UUIDFromURI("avatar.ByUUIDGet", updates.Avatar) + if updates.Avatar != nil { + avatar_uuid, err := res.router.UUIDFromURI("avatar.ByUUIDGet", *updates.Avatar) if err != nil { return "", nhttp.NewBadRequest("parse avatar uri: %w", err) } @@ -120,42 +98,20 @@ func (res *userR) ByIDPut(ctx context.Context, r *http.Request, user platform.Us return "", nil } -func (res *userR) SelfGet(ctx context.Context, r *http.Request, user platform.User, query QueryParams) (*contentUserSelf, *nhttp.ErrorWithStatus) { - counts, err := platform.NotificationCountsForUser(ctx, user) +func (res *userR) SelfGet(ctx context.Context, r *http.Request, user platform.User, query QueryParams) (*user, *nhttp.ErrorWithStatus) { + resp, err := res.response(&user) if err != nil { - return nil, nhttp.NewError("get notifications: %w", err) + return nil, nhttp.NewError("create response: %w", err) } - org, err := platform.OrganizationByID(ctx, int(user.Organization.ID)) - if err != nil { - return nil, nhttp.NewError("get org: %w", err) - } - user.Organization = *org - user.NotificationCounts = *counts - urls := html.NewContentURL() - return &contentUserSelf{ - Self: user, - URLs: contentURLs{ - API: contentURLAPI{ - Avatar: config.MakeURLNidus("/api/avatar"), - Communication: urls.API.Communication, - PublicreportMessage: urls.API.Publicreport.Message, - ReviewTask: config.MakeURLNidus("/api/review-task"), - Signal: config.MakeURLNidus("/api/signal"), - Upload: config.MakeURLNidus("/api/upload"), - User: config.MakeURLNidus("/api/user"), - }, - Tegola: urls.Tegola, - Tile: config.MakeURLNidus("/api/tile/{z}/{y}/{x}"), - }, - }, nil + return resp, nil } -func (res *userR) List(ctx context.Context, r *http.Request, user platform.User, query QueryParams) ([]*userResponse, *nhttp.ErrorWithStatus) { - users, err := platform.UserList(ctx, user) +func (res *userR) List(ctx context.Context, r *http.Request, u platform.User, query QueryParams) ([]*user, *nhttp.ErrorWithStatus) { + users, err := platform.UserList(ctx, u) if err != nil { return nil, nhttp.NewError("list users: %w", err) } - results := make([]*userResponse, len(users)) + results := make([]*user, len(users)) log.Debug().Int("len", len(users)).Msg("building response") for i, v := range users { log.Debug().Int("i", i).Msg("making results") diff --git a/ts/components/CommunicationColumnDetail.vue b/ts/components/CommunicationColumnDetail.vue index 4d5abf51..289a2a1c 100644 --- a/ts/components/CommunicationColumnDetail.vue +++ b/ts/components/CommunicationColumnDetail.vue @@ -33,7 +33,10 @@
A flyover pool
-loading...
loading