github.com/cjdelisle/matterfoss@v5.11.1+incompatible/model/group_syncable.go (about) 1 // Copyright (c) 2018-present Mattermost, Inc. All Rights Reserved. 2 // See License.txt for license information. 3 4 package model 5 6 import ( 7 "encoding/json" 8 "fmt" 9 "io" 10 "io/ioutil" 11 "net/http" 12 ) 13 14 type GroupSyncableType string 15 16 const ( 17 GroupSyncableTypeTeam GroupSyncableType = "Team" 18 GroupSyncableTypeChannel GroupSyncableType = "Channel" 19 ) 20 21 func (gst GroupSyncableType) String() string { 22 return string(gst) 23 } 24 25 type GroupSyncable struct { 26 GroupId string `json:"group_id"` 27 28 // SyncableId represents the Id of the model that is being synced with the group, for example a ChannelId or 29 // TeamId. 30 SyncableId string `db:"-" json:"-"` 31 32 AutoAdd bool `json:"auto_add"` 33 CreateAt int64 `json:"create_at"` 34 DeleteAt int64 `json:"delete_at"` 35 UpdateAt int64 `json:"update_at"` 36 Type GroupSyncableType `db:"-" json:"-"` 37 38 // Values joined in from the associated team and/or channel 39 ChannelDisplayName string `db:"-" json:"-"` 40 TeamDisplayName string `db:"-" json:"-"` 41 TeamType string `db:"-" json:"-"` 42 ChannelType string `db:"-" json:"-"` 43 TeamID string `db:"-" json:"-"` 44 } 45 46 func (syncable *GroupSyncable) IsValid() *AppError { 47 if !IsValidId(syncable.GroupId) { 48 return NewAppError("GroupSyncable.SyncableIsValid", "model.group_syncable.group_id.app_error", nil, "", http.StatusBadRequest) 49 } 50 if !IsValidId(syncable.SyncableId) { 51 return NewAppError("GroupSyncable.SyncableIsValid", "model.group_syncable.syncable_id.app_error", nil, "", http.StatusBadRequest) 52 } 53 return nil 54 } 55 56 func (syncable *GroupSyncable) UnmarshalJSON(b []byte) error { 57 var kvp map[string]interface{} 58 err := json.Unmarshal(b, &kvp) 59 if err != nil { 60 return err 61 } 62 for key, value := range kvp { 63 switch key { 64 case "team_id": 65 syncable.SyncableId = value.(string) 66 syncable.Type = GroupSyncableTypeTeam 67 case "channel_id": 68 syncable.SyncableId = value.(string) 69 syncable.Type = GroupSyncableTypeChannel 70 case "group_id": 71 syncable.GroupId = value.(string) 72 case "auto_add": 73 syncable.AutoAdd = value.(bool) 74 default: 75 } 76 } 77 return nil 78 } 79 80 func (syncable *GroupSyncable) MarshalJSON() ([]byte, error) { 81 type Alias GroupSyncable 82 83 switch syncable.Type { 84 case GroupSyncableTypeTeam: 85 return json.Marshal(&struct { 86 TeamID string `json:"team_id"` 87 TeamDisplayName string `json:"team_display_name,omitempty"` 88 TeamType string `json:"team_type,omitempty"` 89 *Alias 90 }{ 91 TeamDisplayName: syncable.TeamDisplayName, 92 TeamType: syncable.TeamType, 93 TeamID: syncable.SyncableId, 94 Alias: (*Alias)(syncable), 95 }) 96 case GroupSyncableTypeChannel: 97 return json.Marshal(&struct { 98 ChannelID string `json:"channel_id"` 99 ChannelDisplayName string `json:"channel_display_name,omitempty"` 100 ChannelType string `json:"channel_type,omitempty"` 101 102 TeamID string `json:"team_id,omitempty"` 103 TeamDisplayName string `json:"team_display_name,omitempty"` 104 TeamType string `json:"team_type,omitempty"` 105 106 *Alias 107 }{ 108 ChannelID: syncable.SyncableId, 109 ChannelDisplayName: syncable.ChannelDisplayName, 110 ChannelType: syncable.ChannelType, 111 112 TeamID: syncable.TeamID, 113 TeamDisplayName: syncable.TeamDisplayName, 114 TeamType: syncable.TeamType, 115 116 Alias: (*Alias)(syncable), 117 }) 118 default: 119 return nil, &json.MarshalerError{ 120 Err: fmt.Errorf("unknown syncable type: %s", syncable.Type), 121 } 122 } 123 } 124 125 type GroupSyncablePatch struct { 126 AutoAdd *bool `json:"auto_add"` 127 } 128 129 func (syncable *GroupSyncable) Patch(patch *GroupSyncablePatch) { 130 if patch.AutoAdd != nil { 131 syncable.AutoAdd = *patch.AutoAdd 132 } 133 } 134 135 type UserTeamIDPair struct { 136 UserID string 137 TeamID string 138 } 139 140 type UserChannelIDPair struct { 141 UserID string 142 ChannelID string 143 } 144 145 func GroupSyncableFromJson(data io.Reader) *GroupSyncable { 146 groupSyncable := &GroupSyncable{} 147 bodyBytes, _ := ioutil.ReadAll(data) 148 json.Unmarshal(bodyBytes, groupSyncable) 149 return groupSyncable 150 } 151 152 func GroupSyncablesFromJson(data io.Reader) []*GroupSyncable { 153 groupSyncables := []*GroupSyncable{} 154 bodyBytes, _ := ioutil.ReadAll(data) 155 json.Unmarshal(bodyBytes, &groupSyncables) 156 return groupSyncables 157 }