github.com/status-im/status-go@v1.1.0/server/server_media.go (about) 1 package server 2 3 import ( 4 "database/sql" 5 "net/url" 6 "strconv" 7 8 "github.com/status-im/status-go/ipfs" 9 "github.com/status-im/status-go/logutils" 10 "github.com/status-im/status-go/multiaccounts" 11 "github.com/status-im/status-go/protocol/common" 12 "github.com/status-im/status-go/services/wallet/thirdparty" 13 "github.com/status-im/status-go/signal" 14 ) 15 16 type MediaServer struct { 17 Server 18 19 db *sql.DB 20 downloader *ipfs.Downloader 21 multiaccountsDB *multiaccounts.Database 22 walletDB *sql.DB 23 } 24 25 // NewMediaServer returns a *MediaServer 26 func NewMediaServer(db *sql.DB, downloader *ipfs.Downloader, multiaccountsDB *multiaccounts.Database, walletDB *sql.DB) (*MediaServer, error) { 27 err := generateMediaTLSCert() 28 if err != nil { 29 return nil, err 30 } 31 32 s := &MediaServer{ 33 Server: NewServer( 34 globalMediaCertificate, 35 Localhost, 36 signal.SendMediaServerStarted, 37 logutils.ZapLogger().Named("MediaServer"), 38 ), 39 db: db, 40 downloader: downloader, 41 multiaccountsDB: multiaccountsDB, 42 walletDB: walletDB, 43 } 44 s.SetHandlers(HandlerPatternMap{ 45 accountImagesPath: handleAccountImages(s.multiaccountsDB, s.logger), 46 accountInitialsPath: handleAccountInitials(s.multiaccountsDB, s.logger), 47 audioPath: handleAudio(s.db, s.logger), 48 contactImagesPath: handleContactImages(s.db, s.logger), 49 discordAttachmentsPath: handleDiscordAttachment(s.db, s.logger), 50 discordAuthorsPath: handleDiscordAuthorAvatar(s.db, s.logger), 51 generateQRCode: handleQRCodeGeneration(s.multiaccountsDB, s.logger), 52 imagesPath: handleImage(s.db, s.logger), 53 ipfsPath: handleIPFS(s.downloader, s.logger), 54 LinkPreviewThumbnailPath: handleLinkPreviewThumbnail(s.db, s.logger), 55 LinkPreviewFaviconPath: handleLinkPreviewFavicon(s.db, s.logger), 56 StatusLinkPreviewThumbnailPath: handleStatusLinkPreviewThumbnail(s.db, s.logger), 57 communityTokenImagesPath: handleCommunityTokenImages(s.db, s.logger), 58 communityDescriptionImagesPath: handleCommunityDescriptionImagesPath(s.db, s.logger), 59 communityDescriptionTokenImagesPath: handleCommunityDescriptionTokenImagesPath(s.db, s.logger), 60 walletCommunityImagesPath: handleWalletCommunityImages(s.walletDB, s.logger), 61 walletCollectionImagesPath: handleWalletCollectionImages(s.walletDB, s.logger), 62 walletCollectibleImagesPath: handleWalletCollectibleImages(s.walletDB, s.logger), 63 }) 64 65 return s, nil 66 } 67 68 func (s *MediaServer) MakeImageServerURL() string { 69 u := s.MakeBaseURL() 70 u.Path = basePath + "/" 71 return u.String() 72 } 73 74 func (s *MediaServer) MakeImageURL(id string) string { 75 u := s.MakeBaseURL() 76 u.Path = imagesPath 77 u.RawQuery = url.Values{"messageId": {id}}.Encode() 78 79 return u.String() 80 } 81 82 func (s *MediaServer) MakeLinkPreviewThumbnailURL(msgID string, previewURL string) string { 83 u := s.MakeBaseURL() 84 u.Path = LinkPreviewThumbnailPath 85 u.RawQuery = url.Values{"message-id": {msgID}, "url": {previewURL}}.Encode() 86 return u.String() 87 } 88 89 func (s *MediaServer) MakeStatusLinkPreviewThumbnailURL(msgID string, previewURL string, imageID common.MediaServerImageID) string { 90 u := s.MakeBaseURL() 91 u.Path = StatusLinkPreviewThumbnailPath 92 u.RawQuery = url.Values{"message-id": {msgID}, "url": {previewURL}, "image-id": {string(imageID)}}.Encode() 93 return u.String() 94 } 95 96 func (s *MediaServer) MakeLinkPreviewFaviconURL(msgID string, previewURL string) string { 97 u := s.MakeBaseURL() 98 u.Path = LinkPreviewFaviconPath 99 u.RawQuery = url.Values{"message-id": {msgID}, "url": {previewURL}}.Encode() 100 return u.String() 101 } 102 103 func (s *MediaServer) MakeDiscordAuthorAvatarURL(authorID string) string { 104 u := s.MakeBaseURL() 105 u.Path = discordAuthorsPath 106 u.RawQuery = url.Values{"authorId": {authorID}}.Encode() 107 108 return u.String() 109 } 110 111 func (s *MediaServer) MakeDiscordAttachmentURL(messageID string, id string) string { 112 u := s.MakeBaseURL() 113 u.Path = discordAttachmentsPath 114 u.RawQuery = url.Values{"messageId": {messageID}, "attachmentId": {id}}.Encode() 115 116 return u.String() 117 } 118 119 func (s *MediaServer) MakeAudioURL(id string) string { 120 u := s.MakeBaseURL() 121 u.Path = audioPath 122 u.RawQuery = url.Values{"messageId": {id}}.Encode() 123 124 return u.String() 125 } 126 127 func (s *MediaServer) MakeStickerURL(stickerHash string) string { 128 u := s.MakeBaseURL() 129 u.Path = ipfsPath 130 u.RawQuery = url.Values{"hash": {stickerHash}}.Encode() 131 132 return u.String() 133 } 134 135 func (s *MediaServer) MakeQRURL(qurul string, 136 allowProfileImage string, 137 level string, 138 size string, 139 keyUID string, 140 imageName string) string { 141 u := s.MakeBaseURL() 142 u.Path = generateQRCode 143 u.RawQuery = url.Values{"url": {qurul}, 144 "level": {level}, 145 "allowProfileImage": {allowProfileImage}, 146 "size": {size}, 147 "keyUid": {keyUID}, 148 "imageName": {imageName}}.Encode() 149 150 return u.String() 151 } 152 153 func (s *MediaServer) MakeContactImageURL(publicKey string, imageType string) string { 154 u := s.MakeBaseURL() 155 u.Path = contactImagesPath 156 u.RawQuery = url.Values{"publicKey": {publicKey}, "imageName": {imageType}}.Encode() 157 158 return u.String() 159 } 160 161 func (s *MediaServer) MakeCommunityTokenImagesURL(communityID string, chainID uint64, symbol string) string { 162 u := s.MakeBaseURL() 163 u.Path = communityTokenImagesPath 164 u.RawQuery = url.Values{ 165 "communityID": {communityID}, 166 "chainID": {strconv.FormatUint(chainID, 10)}, 167 "symbol": {symbol}, 168 }.Encode() 169 170 return u.String() 171 } 172 173 func (s *MediaServer) MakeCommunityImageURL(communityID, name string) string { 174 u := s.MakeBaseURL() 175 u.Path = communityDescriptionImagesPath 176 u.RawQuery = url.Values{ 177 "communityID": {communityID}, 178 "name": {name}, 179 }.Encode() 180 181 return u.String() 182 } 183 184 func (s *MediaServer) MakeCommunityDescriptionTokenImageURL(communityID, symbol string) string { 185 u := s.MakeBaseURL() 186 u.Path = communityDescriptionTokenImagesPath 187 u.RawQuery = url.Values{ 188 "communityID": {communityID}, 189 "symbol": {symbol}, 190 }.Encode() 191 192 return u.String() 193 } 194 195 func (s *MediaServer) MakeWalletCommunityImagesURL(communityID string) string { 196 u := s.MakeBaseURL() 197 u.Path = walletCommunityImagesPath 198 u.RawQuery = url.Values{ 199 "communityID": {communityID}, 200 }.Encode() 201 202 return u.String() 203 } 204 205 func (s *MediaServer) MakeWalletCollectionImagesURL(contractID thirdparty.ContractID) string { 206 u := s.MakeBaseURL() 207 u.Path = walletCollectionImagesPath 208 u.RawQuery = url.Values{ 209 "chainID": {contractID.ChainID.String()}, 210 "contractAddress": {contractID.Address.Hex()}, 211 }.Encode() 212 213 return u.String() 214 } 215 216 func (s *MediaServer) MakeWalletCollectibleImagesURL(collectibleID thirdparty.CollectibleUniqueID) string { 217 u := s.MakeBaseURL() 218 u.Path = walletCollectibleImagesPath 219 u.RawQuery = url.Values{ 220 "chainID": {collectibleID.ContractID.ChainID.String()}, 221 "contractAddress": {collectibleID.ContractID.Address.Hex()}, 222 "tokenID": {collectibleID.TokenID.String()}, 223 }.Encode() 224 225 return u.String() 226 }