update profile on join.

This commit is contained in:
Miroslav Šedivý 2024-07-24 23:41:20 +02:00
parent 0f1f218694
commit 679157ef6d
5 changed files with 73 additions and 8 deletions

View file

@ -46,6 +46,7 @@ func (api *ApiManagerCtx) Route(r types.Router) {
r.Post("/logout", api.Logout) r.Post("/logout", api.Logout)
r.Get("/whoami", api.Whoami) r.Get("/whoami", api.Whoami)
r.Post("/profile", api.UpdateProfile)
sessionsHandler := sessions.New(api.sessions) sessionsHandler := sessions.New(api.sessions)
r.Route("/sessions", sessionsHandler.Route) r.Route("/sessions", sessionsHandler.Route)

View file

@ -83,3 +83,23 @@ func (api *ApiManagerCtx) Whoami(w http.ResponseWriter, r *http.Request) error {
State: session.State(), State: session.State(),
}) })
} }
func (api *ApiManagerCtx) UpdateProfile(w http.ResponseWriter, r *http.Request) error {
session, _ := auth.GetSession(r)
data := &types.MemberProfile{}
if err := utils.HttpJsonRequest(w, r, data); err != nil {
return err
}
err := api.sessions.Update(session.ID(), *data)
if err != nil {
if errors.Is(err, types.ErrSessionNotFound) {
return utils.HttpBadRequest("session does not exist")
} else {
return utils.HttpInternalServerError().WithInternalErr(err)
}
}
return utils.HttpSuccess(w, true)
}

View file

@ -45,8 +45,15 @@ func (s *session) wsToBackend(msg []byte) error {
if err != nil { if err != nil {
return err return err
} }
´
if request.DisplayName != "" {
s.profile.Name = request.DisplayName
// TODO: Set Display Name here. err = s.apiReq(http.MethodPost, "/api/profile", s.profile, nil)
if err != nil {
return err
}
}
return s.toBackend(event.SIGNAL_ANSWER, &message.SignalDescription{ return s.toBackend(event.SIGNAL_ANSWER, &message.SignalDescription{
SDP: request.SDP, SDP: request.SDP,

View file

@ -18,21 +18,21 @@ import (
"github.com/demodesk/neko/pkg/types/message" "github.com/demodesk/neko/pkg/types/message"
) )
func sessionDataToMember(id string, session message.SessionData) (*oldTypes.Member, error) { func profileToMember(id string, profile types.MemberProfile) (*oldTypes.Member, error) {
settings := chat.Settings{ settings := chat.Settings{
CanSend: true, // defaults to true CanSend: true, // defaults to true
CanReceive: true, // defaults to true CanReceive: true, // defaults to true
} }
err := session.Profile.Plugins.Unmarshal(chat.PluginName, &settings) err := profile.Plugins.Unmarshal(chat.PluginName, &settings)
if err != nil && !errors.Is(err, types.ErrPluginSettingsNotFound) { if err != nil && !errors.Is(err, types.ErrPluginSettingsNotFound) {
return nil, fmt.Errorf("unable to unmarshal %s plugin settings from global settings: %w", chat.PluginName, err) return nil, fmt.Errorf("unable to unmarshal %s plugin settings from global settings: %w", chat.PluginName, err)
} }
return &oldTypes.Member{ return &oldTypes.Member{
ID: id, ID: id,
Name: session.Profile.Name, Name: profile.Name,
Admin: session.Profile.IsAdmin, Admin: profile.IsAdmin,
Muted: !settings.CanSend, Muted: !settings.CanSend,
}, nil }, nil
} }
@ -122,7 +122,7 @@ func (s *session) wsToClient(msg []byte) error {
if !session.State.IsConnected { if !session.State.IsConnected {
continue continue
} }
member, err := sessionDataToMember(id, session) member, err := profileToMember(id, session.Profile)
if err != nil { if err != nil {
return err return err
} }
@ -265,7 +265,7 @@ func (s *session) wsToClient(msg []byte) error {
return err return err
} }
member, err := sessionDataToMember(request.ID, *request) member, err := profileToMember(request.ID, request.Profile)
if err != nil { if err != nil {
return err return err
} }
@ -294,6 +294,28 @@ func (s *session) wsToClient(msg []byte) error {
ID: request.ID, ID: request.ID,
}) })
case event.SESSION_PROFILE:
request := &message.MemberProfile{}
err := json.Unmarshal(data.Payload, request)
if err != nil {
return err
}
// session profile is expected to change when updating a name after connecting
member, ok := s.sessions[request.ID]
if !ok && member != nil {
return nil
}
// we only expect the name to be updated, other fields can't be changed
member.Name = request.Name
// oldEvent.MEMBER_CONNECTED if not sent already
return s.toClient(&oldMessage.Member{
Event: oldEvent.MEMBER_CONNECTED,
Member: member,
})
case event.SESSION_STATE: case event.SESSION_STATE:
request := &message.SessionState{} request := &message.SessionState{}
err := json.Unmarshal(data.Payload, request) err := json.Unmarshal(data.Payload, request)
@ -306,7 +328,7 @@ func (s *session) wsToClient(msg []byte) error {
return nil return nil
} }
if request.IsConnected && member != nil { if request.IsConnected && member != nil && member.Name != "" {
s.sessions[request.ID] = nil s.sessions[request.ID] = nil
// oldEvent.MEMBER_CONNECTED if not sent already // oldEvent.MEMBER_CONNECTED if not sent already

View file

@ -110,6 +110,21 @@ paths:
$ref: '#/components/responses/Unauthorized' $ref: '#/components/responses/Unauthorized'
'403': '403':
$ref: '#/components/responses/Forbidden' $ref: '#/components/responses/Forbidden'
/api/profile:
post:
summary: update current profile without syncing it with member profile (experimental)
operationId: profile
responses:
'204':
description: OK
'401':
$ref: '#/components/responses/Unauthorized'
requestBody:
content:
application/json:
schema:
$ref: '#/components/schemas/MemberProfile'
required: true
# #
# sessions # sessions