diff --git a/internal/docs/docs.go b/internal/docs/docs.go index 0214618..11e77d9 100644 --- a/internal/docs/docs.go +++ b/internal/docs/docs.go @@ -982,22 +982,42 @@ const docTemplate = `{ "type": "object", "properties": { "avatar": { - "type": "string" + "$ref": "#/definitions/donat-widget_internal_model.InnerFile" }, "background_img": { - "type": "string" + "$ref": "#/definitions/donat-widget_internal_model.InnerFile" }, "description": { "type": "string" }, "head_img": { - "type": "string" + "$ref": "#/definitions/donat-widget_internal_model.InnerFile" }, "text_after_donat": { "type": "string" } } }, + "donat-widget_internal_model.InnerFile": { + "type": "object", + "properties": { + "file_id": { + "type": "string" + }, + "file_link": { + "type": "string" + }, + "file_name": { + "type": "string" + }, + "file_size": { + "type": "integer" + }, + "file_type": { + "type": "string" + } + } + }, "donat-widget_internal_model.ModerationResponse": { "type": "object", "properties": { diff --git a/internal/docs/swagger.json b/internal/docs/swagger.json index d7780bf..a46684d 100644 --- a/internal/docs/swagger.json +++ b/internal/docs/swagger.json @@ -975,22 +975,42 @@ "type": "object", "properties": { "avatar": { - "type": "string" + "$ref": "#/definitions/donat-widget_internal_model.InnerFile" }, "background_img": { - "type": "string" + "$ref": "#/definitions/donat-widget_internal_model.InnerFile" }, "description": { "type": "string" }, "head_img": { - "type": "string" + "$ref": "#/definitions/donat-widget_internal_model.InnerFile" }, "text_after_donat": { "type": "string" } } }, + "donat-widget_internal_model.InnerFile": { + "type": "object", + "properties": { + "file_id": { + "type": "string" + }, + "file_link": { + "type": "string" + }, + "file_name": { + "type": "string" + }, + "file_size": { + "type": "integer" + }, + "file_type": { + "type": "string" + } + } + }, "donat-widget_internal_model.ModerationResponse": { "type": "object", "properties": { diff --git a/internal/docs/swagger.yaml b/internal/docs/swagger.yaml index 7d10db8..0c4f7a3 100644 --- a/internal/docs/swagger.yaml +++ b/internal/docs/swagger.yaml @@ -137,16 +137,29 @@ definitions: donat-widget_internal_model.InnerDonatePageResponse: properties: avatar: - type: string + $ref: '#/definitions/donat-widget_internal_model.InnerFile' background_img: - type: string + $ref: '#/definitions/donat-widget_internal_model.InnerFile' description: type: string head_img: - type: string + $ref: '#/definitions/donat-widget_internal_model.InnerFile' text_after_donat: type: string type: object + donat-widget_internal_model.InnerFile: + properties: + file_id: + type: string + file_link: + type: string + file_name: + type: string + file_size: + type: integer + file_type: + type: string + type: object donat-widget_internal_model.ModerationResponse: properties: duration: diff --git a/internal/model/models.go b/internal/model/models.go index 373f9db..38ec2aa 100644 --- a/internal/model/models.go +++ b/internal/model/models.go @@ -88,14 +88,49 @@ type Target struct { } type DonatePage struct { - ID int `db:"id"` - StreamerID int `db:"streamer_id"` - Description string `db:"description"` - TextAfterDonat string `db:"text_after_donat"` - HeadImg string `db:"head_img"` - Avatar string `db:"avatar"` - BackgroundImg string `db:"background_img"` - StreamerLogin string `db:"streamer_login"` + // Основные поля + ID int `db:"id" json:"id" example:"1" format:"int64" description:"Уникальный идентификатор страницы доната"` + StreamerID int `db:"streamer_id" json:"streamer_id" example:"1001" format:"int64" description:"ID стримера"` + Description string `db:"description" json:"description" example:"Поддержи этого стримера" description:"Описание страницы доната"` + TextAfterDonat string `db:"text_after_donat" json:"text_after_donat" example:"Спасибо за вашу поддержку!" description:"Текст, который отображается после доната"` + StreamerLogin string `db:"streamer_login" json:"streamer_login" example:"streamer123" description:"Логин/псевдоним стримера"` + + // Поля для хед-изображения + HeadImgFileId uuid.UUID `db:"head_img_id" json:"head_img_id" format:"uuid" example:"550e8400-e29b-41d4-a716-446655440000" description:"UUID файла хед-изображения"` + HeadImgFileName string `db:"head_img_file_name" json:"head_img_file_name" example:"header.png" description:"Имя файла хед-изображения"` + HeadImgType string `db:"head_img_type" json:"head_img_type" example:"image/png" description:"Тип файла хед-изображения"` + HeadImgLink string `json:"head_img_link" example:"https://cdn.example.com/images/550e8400-e29b-41d4-a716-446655440000" description:"Публичный URL хед-изображения"` + HeadImgSize int `db:"head_img_size" json:"head_img_size" example:"1024" description:"Размер файла хед-изображения в байтах"` + + // Поля для аватара + AvatarFileId uuid.UUID `db:"avatar_id" json:"avatar_id" format:"uuid" example:"550e8400-e29b-41d4-a716-446655440001" description:"UUID файла аватара"` + AvatarFileName string `db:"avatar_file_name" json:"avatar_file_name" example:"avatar.png" description:"Имя файла аватара"` + AvatarType string `db:"avatar_type" json:"avatar_type" example:"image/png" description:"Тип файла аватара"` + AvatarLink string `json:"avatar_link" example:"https://cdn.example.com/images/550e8400-e29b-41d4-a716-446655440001" description:"Публичный URL аватара"` + AvatarImgSize int `db:"avatar_img_size" json:"avatar_img_size" example:"512" description:"Размер файла аватара в байтах"` + + // Поля для фона + BackgroundImgFileId uuid.UUID `db:"background_img_id" json:"background_img_id" format:"uuid" example:"550e8400-e29b-41d4-a716-446655440002" description:"UUID файла фона"` + BackgroundImgFileName string `db:"background_img_file_name" json:"background_img_file_name" example:"background.png" description:"Имя файла фона"` + BackgroundImgType string `db:"background_img_type" json:"background_img_type" example:"image/png" description:"Тип файла фона"` + BackgroundImgLink string `json:"background_img_link" example:"https://cdn.example.com/images/550e8400-e29b-41d4-a716-446655440002" description:"Публичный URL фона"` + BackgroundImgSize int `db:"background_img_size" json:"background_img_size" example:"2048" description:"Размер файла фона в байтах"` +} + +type InnerFile struct { + FileID uuid.UUID `json:"file_id"` + FileName string `json:"file_name"` + FileType string `json:"file_type"` + FileLink string `json:"file_link"` + FileSize int `json:"file_size"` +} + +type InnerDonatePageResponse struct { + Description string `json:"description"` + TextAfterDonat string `json:"text_after_donat"` + HeadImg InnerFile `json:"head_img"` + Avatar InnerFile `json:"avatar"` + BackgroundImg InnerFile `json:"background_img"` } type Moderation struct { @@ -105,14 +140,6 @@ type Moderation struct { Duration int `db:"duration"` } -type InnerDonatePageResponse struct { - Description string `json:"description"` - TextAfterDonat string `json:"text_after_donat"` - HeadImg string `json:"head_img"` - Avatar string `json:"avatar"` - BackgroundImg string `json:"background_img"` -} - type OuterDonatePageResponse struct { Login string `json:"login"` OnLine string `json:"online"` diff --git a/internal/model/sql/model.go b/internal/model/sql/model.go index 07ab0d8..0ae6634 100644 --- a/internal/model/sql/model.go +++ b/internal/model/sql/model.go @@ -27,7 +27,8 @@ CREATE TABLE IF NOT EXISTS files ( extension VARCHAR(10) NOT NULL, streamer_id INTEGER NOT NULL, entity VARCHAR(50) NOT NULL DEFAULT 'widget', - created_at TIMESTAMP DEFAULT now() + created_at TIMESTAMP DEFAULT now(), + size FLOAT NOT NULL DEFAULT 0, ) CREATE TABLE IF NOT EXISTS donats ( diff --git a/internal/model/sql/query.go b/internal/model/sql/query.go index f6bdf01..75ed796 100644 --- a/internal/model/sql/query.go +++ b/internal/model/sql/query.go @@ -84,7 +84,36 @@ WHERE id = (@target_id); ` var GetDonationPage = ` -SELECT * FROM donate_pages WHERE streamer_id = (@streamer_id); +SELECT + dp.id, + dp.streamer_id, + dp.description, + dp.text_after_donat, + dp.streamer_login, + + -- Поля для хед-изображения + head_img.id AS head_img_id, + head_img.file_name AS head_img_file_name, + head_img.file_type AS head_img_type, + head_img.size AS head_img_size, + + -- Поля для аватара + avatar.id AS avatar_id, + avatar.file_name AS avatar_file_name, + avatar.file_type AS avatar_type, + avatar.size AS avatar_img_size, + + -- Поля для фона + background_img.id AS background_img_id, + background_img.file_name AS background_img_file_name, + background_img.file_type AS background_img_type, + background_img.size AS background_img_size + +FROM donate_pages dp +LEFT JOIN files head_img ON dp.head_img = head_img.id +LEFT JOIN files avatar ON dp.avatar = avatar.id +LEFT JOIN files background_img ON dp.background_img = background_img.id +WHERE dp.streamer_id = (@streamer_id); ` var GetDonationPageByLogin = ` diff --git a/internal/service/donat/donat.go b/internal/service/donat/donat.go index 7ea5227..2188473 100644 --- a/internal/service/donat/donat.go +++ b/internal/service/donat/donat.go @@ -162,18 +162,45 @@ func (donatService *ServiceDonat) GetInnerDonatPage( ctx context.Context, streamerID model.StreamerID, ) (model.InnerDonatePageResponse, error) { + // Получаем данные страницы доната из репозитория donatePage, err := donatService.donatRepo.GetDonatPage(ctx, streamerID) if err != nil { slog.Error(err.Error()) return model.InnerDonatePageResponse{}, err } - var innerDonatePageResponse = model.InnerDonatePageResponse{ + // Создаем объекты InnerFile для каждого изображения + headImgFile := model.InnerFile{ + FileID: donatePage.HeadImgFileId, + FileName: donatePage.HeadImgFileName, + FileType: donatePage.HeadImgType, + FileLink: donatService.storage.DownloadLink(donatePage.HeadImgFileId), + FileSize: donatePage.HeadImgSize, + } + + avatarFile := model.InnerFile{ + FileID: donatePage.AvatarFileId, + FileName: donatePage.AvatarFileName, + FileType: donatePage.AvatarType, + FileLink: donatService.storage.DownloadLink(donatePage.AvatarFileId), + FileSize: donatePage.AvatarImgSize, + } + + backgroundImgFile := model.InnerFile{ + FileID: donatePage.BackgroundImgFileId, + FileName: donatePage.BackgroundImgFileName, + FileType: donatePage.BackgroundImgType, + FileLink: donatService.storage.DownloadLink(donatePage.BackgroundImgFileId), + FileSize: donatePage.BackgroundImgSize, + } + + // Создаем объект InnerDonatePageResponse + innerDonatePageResponse := model.InnerDonatePageResponse{ Description: donatePage.Description, TextAfterDonat: donatePage.TextAfterDonat, - HeadImg: donatePage.HeadImg, - Avatar: donatePage.Avatar, - BackgroundImg: donatePage.BackgroundImg, + HeadImg: headImgFile, + Avatar: avatarFile, + BackgroundImg: backgroundImgFile, } return innerDonatePageResponse, nil @@ -193,9 +220,9 @@ func (donatService *ServiceDonat) GetOuterDonatPage( Description: donatePage.Description, Login: donatePage.StreamerLogin, OnLine: "online", - BackgroundImg: donatePage.BackgroundImg, - HeadImg: donatePage.HeadImg, - AvatarImg: donatePage.Avatar, + BackgroundImg: donatService.storage.DownloadLink(donatePage.BackgroundImgFileId), + HeadImg: donatService.storage.DownloadLink(donatePage.HeadImgFileId), + AvatarImg: donatService.storage.DownloadLink(donatePage.AvatarFileId), } return outerDonatePageResponse, nil }