github.com/haalcala/mattermost-server-change-repo/v5@v5.33.2/model/post_list.go (about)

     1  // Copyright (c) 2015-present Mattermost, Inc. All Rights Reserved.
     2  // See LICENSE.txt for license information.
     3  
     4  package model
     5  
     6  import (
     7  	"encoding/json"
     8  	"io"
     9  	"sort"
    10  )
    11  
    12  type PostList struct {
    13  	Order      []string         `json:"order"`
    14  	Posts      map[string]*Post `json:"posts"`
    15  	NextPostId string           `json:"next_post_id"`
    16  	PrevPostId string           `json:"prev_post_id"`
    17  }
    18  
    19  func NewPostList() *PostList {
    20  	return &PostList{
    21  		Order:      make([]string, 0),
    22  		Posts:      make(map[string]*Post),
    23  		NextPostId: "",
    24  		PrevPostId: "",
    25  	}
    26  }
    27  
    28  func (o *PostList) ToSlice() []*Post {
    29  	var posts []*Post
    30  	for _, id := range o.Order {
    31  		posts = append(posts, o.Posts[id])
    32  	}
    33  	return posts
    34  }
    35  
    36  func (o *PostList) WithRewrittenImageURLs(f func(string) string) *PostList {
    37  	copy := *o
    38  	copy.Posts = make(map[string]*Post)
    39  	for id, post := range o.Posts {
    40  		copy.Posts[id] = post.WithRewrittenImageURLs(f)
    41  	}
    42  	return &copy
    43  }
    44  
    45  func (o *PostList) StripActionIntegrations() {
    46  	posts := o.Posts
    47  	o.Posts = make(map[string]*Post)
    48  	for id, post := range posts {
    49  		pcopy := post.Clone()
    50  		pcopy.StripActionIntegrations()
    51  		o.Posts[id] = pcopy
    52  	}
    53  }
    54  
    55  func (o *PostList) ToJson() string {
    56  	copy := *o
    57  	copy.StripActionIntegrations()
    58  	b, err := json.Marshal(&copy)
    59  	if err != nil {
    60  		return ""
    61  	}
    62  	return string(b)
    63  }
    64  
    65  func (o *PostList) MakeNonNil() {
    66  	if o.Order == nil {
    67  		o.Order = make([]string, 0)
    68  	}
    69  
    70  	if o.Posts == nil {
    71  		o.Posts = make(map[string]*Post)
    72  	}
    73  
    74  	for _, v := range o.Posts {
    75  		v.MakeNonNil()
    76  	}
    77  }
    78  
    79  func (o *PostList) AddOrder(id string) {
    80  
    81  	if o.Order == nil {
    82  		o.Order = make([]string, 0, 128)
    83  	}
    84  
    85  	o.Order = append(o.Order, id)
    86  }
    87  
    88  func (o *PostList) AddPost(post *Post) {
    89  
    90  	if o.Posts == nil {
    91  		o.Posts = make(map[string]*Post)
    92  	}
    93  
    94  	o.Posts[post.Id] = post
    95  }
    96  
    97  func (o *PostList) UniqueOrder() {
    98  	keys := make(map[string]bool)
    99  	order := []string{}
   100  	for _, postId := range o.Order {
   101  		if _, value := keys[postId]; !value {
   102  			keys[postId] = true
   103  			order = append(order, postId)
   104  		}
   105  	}
   106  
   107  	o.Order = order
   108  }
   109  
   110  func (o *PostList) Extend(other *PostList) {
   111  	for postId := range other.Posts {
   112  		o.AddPost(other.Posts[postId])
   113  	}
   114  
   115  	for _, postId := range other.Order {
   116  		o.AddOrder(postId)
   117  	}
   118  
   119  	o.UniqueOrder()
   120  }
   121  
   122  func (o *PostList) SortByCreateAt() {
   123  	sort.Slice(o.Order, func(i, j int) bool {
   124  		return o.Posts[o.Order[i]].CreateAt > o.Posts[o.Order[j]].CreateAt
   125  	})
   126  }
   127  
   128  func (o *PostList) Etag() string {
   129  
   130  	id := "0"
   131  	var t int64 = 0
   132  
   133  	for _, v := range o.Posts {
   134  		if v.UpdateAt > t {
   135  			t = v.UpdateAt
   136  			id = v.Id
   137  		} else if v.UpdateAt == t && v.Id > id {
   138  			t = v.UpdateAt
   139  			id = v.Id
   140  		}
   141  	}
   142  
   143  	orderId := ""
   144  	if len(o.Order) > 0 {
   145  		orderId = o.Order[0]
   146  	}
   147  
   148  	return Etag(orderId, id, t)
   149  }
   150  
   151  func (o *PostList) IsChannelId(channelId string) bool {
   152  	for _, v := range o.Posts {
   153  		if v.ChannelId != channelId {
   154  			return false
   155  		}
   156  	}
   157  
   158  	return true
   159  }
   160  
   161  func PostListFromJson(data io.Reader) *PostList {
   162  	var o *PostList
   163  	json.NewDecoder(data).Decode(&o)
   164  	return o
   165  }