99 "strings"
1010 "time"
1111 "unicode/utf8"
12+
13+ streamchat "github.com/GetStream/stream-chat-go/v5"
1214)
1315
1416var (
@@ -35,6 +37,8 @@ func newItem(rawItem *rawItem) (Item, error) {
3537 return newMessageItem (rawItem .Item )
3638 case "reaction" :
3739 return newReactionItem (rawItem .Item )
40+ case "device" :
41+ return newDeviceItem (rawItem .Item )
3842 default :
3943 return nil , fmt .Errorf ("invalid item type %q" , rawItem .Type )
4044 }
@@ -88,14 +92,20 @@ func newUserItem(itemBody json.RawMessage) (*userItem, error) {
8892}
8993
9094type userItem struct {
91- ID string `json:"id"`
92- Role string `json:"role"`
93- Invisible bool `json:"invisible"`
94- CreatedAt time.Time `json:"created_at"`
95- UpdatedAt time.Time `json:"updated_at"`
96- DeletedAt time.Time `json:"deleted_at"`
97- Teams []string `json:"teams"`
98- Custom extraFields
95+ ID string `json:"id"`
96+ Role string `json:"role"`
97+ Invisible bool `json:"invisible"`
98+ CreatedAt time.Time `json:"created_at"`
99+ UpdatedAt time.Time `json:"updated_at"`
100+ DeletedAt time.Time `json:"deleted_at"`
101+ Teams []string `json:"teams"`
102+ PushNotifications pushNotification `json:"push_notifications"`
103+ Custom extraFields
104+ }
105+
106+ type pushNotification struct {
107+ Disabled bool `json:"disabled"`
108+ DisabledUntil * time.Time `json:"disabled_until"`
99109}
100110
101111func (u * userItem ) validateFields () error {
@@ -130,6 +140,78 @@ func (u *userItem) validateReferences(idx *index) error {
130140 return nil
131141}
132142
143+ type deviceItem struct {
144+ ID string `json:"id"`
145+ UserID string `json:"user_id"`
146+ CreatedAt time.Time `json:"created_at"`
147+ Disabled bool `json:"disabled"`
148+ DisabledReason string `json:"disabled_reason"`
149+ PushProviderType string `json:"push_provider_type"`
150+ PushProviderName string `json:"push_provider_name"`
151+ }
152+
153+ func newDeviceItem (itemBody json.RawMessage ) (* deviceItem , error ) {
154+ var device deviceItem
155+ if err := unmarshalItem (itemBody , & device ); err != nil {
156+ return nil , err
157+ }
158+ return & device , nil
159+ }
160+
161+ var pushProviders = []string {
162+ streamchat .PushProviderFirebase ,
163+ streamchat .PushProviderHuawei ,
164+ streamchat .PushProviderAPNS ,
165+ streamchat .PushProviderXiaomi ,
166+ }
167+
168+ func (d * deviceItem ) validateFields () error {
169+ if d .ID == "" {
170+ return errors .New ("device.id required" )
171+ }
172+ if len (d .ID ) > 255 {
173+ return errors .New ("device.id max length exceeded (255)" )
174+ }
175+
176+ if d .UserID == "" {
177+ return errors .New ("device.user_id required" )
178+ }
179+ if len (d .UserID ) > 255 {
180+ return errors .New ("device.user_id max length exceeded (255)" )
181+ }
182+
183+ if d .CreatedAt .IsZero () {
184+ return errors .New ("device.created_at required" )
185+ }
186+
187+ if d .PushProviderType == "" {
188+ return errors .New ("device.push_provider_type required" )
189+ }
190+ var found bool
191+ for _ , p := range pushProviders {
192+ if d .PushProviderType == p {
193+ found = true
194+ break
195+ }
196+ }
197+ if ! found {
198+ return fmt .Errorf ("device.push_provider_type invalid, available options are: %s" , strings .Join (pushProviders , "," ))
199+ }
200+
201+ return nil
202+ }
203+
204+ func (d * deviceItem ) index (i * index ) error {
205+ return i .addDevice (d .ID )
206+ }
207+
208+ func (d * deviceItem ) validateReferences (i * index ) error {
209+ if d .UserID != "" && ! i .userExist (d .UserID ) {
210+ return fmt .Errorf ("device.user_id %q doesn't exist" , d .UserID )
211+ }
212+ return nil
213+ }
214+
133215var channelReservedFields = []string {
134216 "last_message_at" , "cid" , "created_by_pk" , "members" , "config" , "app_pk" , "pk" ,
135217}
0 commit comments