feat: add 4 missing SQS API commands for Yandex/AWS compatibility

- ChangeMessageVisibilityBatch: batch visibility timeout (up to 10 msgs)
- TagQueue: add/update queue tags
- UntagQueue: remove queue tags by keys
- ListQueueTags: list all queue tags
- Added Tags field to Queue struct
- Request/Response models for all 4 commands
- Registered in router (17 total API commands now)
- Yandex Message Queue API reference doc
This commit is contained in:
Naeel
2026-04-11 07:51:17 +03:00
parent c9d9231efc
commit fbecde72eb
10 changed files with 1250 additions and 0 deletions
+1
View File
@@ -63,6 +63,7 @@ type Queue struct {
FIFOSequenceNumbers map[string]int
EnableDuplicates bool
Duplicates map[string]time.Time
Tags map[string]string
}
func (q *Queue) NextSequenceNumber(groupId string) string {
+90
View File
@@ -530,3 +530,93 @@ func (r *DeleteMessageBatchRequest) SetAttributesFromForm(values url.Values) {
r.Entries = entries
}
}
/*** ChangeMessageVisibilityBatch Request ***/
type ChangeMessageVisibilityBatchRequestEntry struct {
Id string `json:"Id" schema:"Id"`
ReceiptHandle string `json:"ReceiptHandle" schema:"ReceiptHandle"`
VisibilityTimeout int `json:"VisibilityTimeout" schema:"VisibilityTimeout"`
}
type ChangeMessageVisibilityBatchRequest struct {
Entries []ChangeMessageVisibilityBatchRequestEntry `json:"Entries"`
QueueUrl string `json:"QueueUrl" schema:"QueueUrl"`
}
func NewChangeMessageVisibilityBatchRequest() *ChangeMessageVisibilityBatchRequest {
return &ChangeMessageVisibilityBatchRequest{}
}
// SetAttributesFromForm — парсит AWS Query Protocol: ChangeMessageVisibilityBatchRequestEntry.N.*
func (r *ChangeMessageVisibilityBatchRequest) SetAttributesFromForm(values url.Values) {
for i := 1; ; i++ {
id := values.Get(fmt.Sprintf("ChangeMessageVisibilityBatchRequestEntry.%d.Id", i))
receiptHandle := values.Get(fmt.Sprintf("ChangeMessageVisibilityBatchRequestEntry.%d.ReceiptHandle", i))
if id == "" || receiptHandle == "" {
break
}
entry := ChangeMessageVisibilityBatchRequestEntry{
Id: id,
ReceiptHandle: receiptHandle,
}
vt := values.Get(fmt.Sprintf("ChangeMessageVisibilityBatchRequestEntry.%d.VisibilityTimeout", i))
if vt != "" {
entry.VisibilityTimeout, _ = strconv.Atoi(vt)
}
r.Entries = append(r.Entries, entry)
}
}
/*** TagQueue Request ***/
type TagQueueRequest struct {
QueueUrl string `json:"QueueUrl" schema:"QueueUrl"`
Tags map[string]string `json:"Tags"`
}
func NewTagQueueRequest() *TagQueueRequest {
return &TagQueueRequest{Tags: make(map[string]string)}
}
// SetAttributesFromForm — парсит AWS Query Protocol: Tag.N.Key / Tag.N.Value
func (r *TagQueueRequest) SetAttributesFromForm(values url.Values) {
for i := 1; ; i++ {
key := values.Get(fmt.Sprintf("Tag.%d.Key", i))
value := values.Get(fmt.Sprintf("Tag.%d.Value", i))
if key == "" {
break
}
r.Tags[key] = value
}
}
/*** UntagQueue Request ***/
type UntagQueueRequest struct {
QueueUrl string `json:"QueueUrl" schema:"QueueUrl"`
TagKeys []string `json:"TagKeys"`
}
func NewUntagQueueRequest() *UntagQueueRequest {
return &UntagQueueRequest{}
}
// SetAttributesFromForm — парсит AWS Query Protocol: TagKey.N
func (r *UntagQueueRequest) SetAttributesFromForm(values url.Values) {
for i := 1; ; i++ {
key := values.Get(fmt.Sprintf("TagKey.%d", i))
if key == "" {
break
}
r.TagKeys = append(r.TagKeys, key)
}
}
/*** ListQueueTags Request ***/
type ListQueueTagsRequest struct {
QueueUrl string `json:"QueueUrl" schema:"QueueUrl"`
}
func NewListQueueTagsRequest() *ListQueueTagsRequest {
return &ListQueueTagsRequest{}
}
func (r *ListQueueTagsRequest) SetAttributesFromForm(values url.Values) {}
+71
View File
@@ -338,3 +338,74 @@ func (r DeleteMessageBatchResponse) GetResult() interface{} {
func (r DeleteMessageBatchResponse) GetRequestId() string {
return r.Metadata.RequestId
}
/*** ChangeMessageVisibilityBatch Response ***/
type ChangeMessageVisibilityBatchResultEntry struct {
Id string `json:"Id" xml:"Id"`
}
type ChangeMessageVisibilityBatchResult struct {
Successful []ChangeMessageVisibilityBatchResultEntry `json:"Successful" xml:"ChangeMessageVisibilityBatchResultEntry"`
Failed []BatchResultErrorEntry `json:"Failed,omitempty" xml:"BatchResultErrorEntry,omitempty"`
}
type ChangeMessageVisibilityBatchResponse struct {
Xmlns string `json:"Xmlns" xml:"xmlns,attr"`
Result ChangeMessageVisibilityBatchResult `json:"ChangeMessageVisibilityBatchResult" xml:"ChangeMessageVisibilityBatchResult"`
Metadata ResponseMetadata `json:"ResponseMetadata" xml:"ResponseMetadata"`
}
func (r ChangeMessageVisibilityBatchResponse) GetResult() interface{} {
return r.Result
}
func (r ChangeMessageVisibilityBatchResponse) GetRequestId() string {
return r.Metadata.RequestId
}
/*** TagQueue Response ***/
type TagQueueResponse struct {
Xmlns string `json:"Xmlns" xml:"xmlns,attr"`
Metadata ResponseMetadata `json:"ResponseMetadata" xml:"ResponseMetadata"`
}
func (r TagQueueResponse) GetResult() interface{} {
return nil
}
func (r TagQueueResponse) GetRequestId() string {
return r.Metadata.RequestId
}
/*** UntagQueue Response ***/
type UntagQueueResponse struct {
Xmlns string `json:"Xmlns" xml:"xmlns,attr"`
Metadata ResponseMetadata `json:"ResponseMetadata" xml:"ResponseMetadata"`
}
func (r UntagQueueResponse) GetResult() interface{} {
return nil
}
func (r UntagQueueResponse) GetRequestId() string {
return r.Metadata.RequestId
}
/*** ListQueueTags Response ***/
type ListQueueTagsResult struct {
Tags map[string]string `json:"Tags" xml:"Tag"`
}
type ListQueueTagsResponse struct {
Xmlns string `json:"Xmlns" xml:"xmlns,attr"`
Result ListQueueTagsResult `json:"ListQueueTagsResult" xml:"ListQueueTagsResult"`
Metadata ResponseMetadata `json:"ResponseMetadata" xml:"ResponseMetadata"`
}
func (r ListQueueTagsResponse) GetResult() interface{} {
return r.Result
}
func (r ListQueueTagsResponse) GetRequestId() string {
return r.Metadata.RequestId
}