// makeSureMembership checks if the incoming account is a member of the group // channel that is persisted within incoming session data func makeSureMembership(groupChannel *models.Channel, accountId int64) error { isMember, err := models.Cache.Participant.ByChannelIdAndAccountId(groupChannel.Id, accountId) if err != nil { return err } // we dont need to do anything if the user is a member of group channel if isMember { return nil } _, err = groupChannel.AddParticipant(accountId) if err != nil && err != models.ErrAccountIsAlreadyInTheChannel { return err } return models.Cache.Participant.SetToCache(groupChannel.Id, accountId) }
func Create(u *url.URL, h http.Header, req *models.Channel, context *models.Context) (int, http.Header, interface{}, error) { // only logged in users can create a channel if !context.IsLoggedIn() { return response.NewBadRequest(models.ErrNotLoggedIn) } // get group name from context req.GroupName = context.GroupName req.CreatorId = context.Client.Account.Id if req.PrivacyConstant == "" { req.PrivacyConstant = models.Channel_PRIVACY_PRIVATE // if group is koding, then make it public, because it was public before if req.GroupName == models.Channel_KODING_NAME { req.PrivacyConstant = models.Channel_PRIVACY_PUBLIC } } if req.TypeConstant == "" { req.TypeConstant = models.Channel_TYPE_TOPIC } if err := validateChannelRequest(req); err != nil { return response.NewBadRequest(err) } if err := req.Create(); err != nil { return response.NewBadRequest(err) } if _, err := req.AddParticipant(req.CreatorId); err != nil { // channel create works as idempotent, that channel might have been created before if err != models.ErrAccountIsAlreadyInTheChannel { return response.NewBadRequest(err) } } cc := models.NewChannelContainer() if err := cc.PopulateWith(*req, context.Client.Account.Id); err != nil { return response.NewBadRequest(err) } return response.NewOK(cc) }