Files
SQS-service/app/models/responses.go
T
Naeel fbecde72eb 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
2026-04-11 07:51:17 +03:00

412 lines
13 KiB
Go

package models
import (
"encoding/xml"
)
type ResponseMetadata struct {
RequestId string `xml:"RequestId"`
}
// NOTE: Every response in here MUST implement the `AbstractResponseBody` interface in order to be used
// in `encodeResponse`
/*** Error Responses ***/
type ErrorResult struct {
Type string `json:"Type,omitempty" xml:"Type,omitempty"`
Code string `json:"Code,omitempty" xml:"Code,omitempty"`
Message string `json:"Message,omitempty" xml:"Message,omitempty"`
}
type ErrorResponse struct {
Result ErrorResult `json:"Error" xml:"Error"`
RequestId string `json:"RequestId" xml:"RequestId"`
}
func (r ErrorResponse) GetResult() interface{} {
return r.Result
}
func (r ErrorResponse) GetRequestId() string {
return r.RequestId
}
/*** Receive Message Response */
type ReceiveMessageResult struct {
Messages []*ResultMessage `json:"Messages" xml:"Message,omitempty"`
}
type ReceiveMessageResponse struct {
Xmlns string `json:"Xmlns" xml:"xmlns,attr"`
Result ReceiveMessageResult `json:"ReceiveMessageResult" xml:"ReceiveMessageResult"`
Metadata ResponseMetadata `json:"ResponseMetadata" xml:"ResponseMetadata"`
}
func (r ReceiveMessageResponse) GetResult() interface{} {
return r.Result
}
func (r ReceiveMessageResponse) GetRequestId() string {
return r.Metadata.RequestId
}
type ResultMessage struct {
MessageId string `json:"MessageId,omitempty" xml:"MessageId,omitempty"`
ReceiptHandle string `json:"ReceiptHandle,omitempty" xml:"ReceiptHandle,omitempty"`
MD5OfBody string `json:"MD5OfBody,omitempty" xml:"MD5OfBody,omitempty"`
Body string `json:"Body,omitempty" xml:"Body,omitempty"`
MD5OfMessageAttributes string `json:"MD5OfMessageAttributes,omitempty" xml:"MD5OfMessageAttributes,omitempty"`
MessageAttributes map[string]MessageAttribute `json:"MessageAttributes,omitempty" xml:"MessageAttribute,omitempty,attr"`
Attributes map[string]string `json:"Attributes,omitempty" xml:"Attribute,omitempty,attr"`
}
// MarshalXML is a custom marshaler for the ResultMessage struct. We need it because we need to convert the
// maps into something that can be shown as XML. If we ever get rid of the XML response parsing this can go,
// and that would be glorious.
func (r *ResultMessage) MarshalXML(e *xml.Encoder, start xml.StartElement) error {
type Attributes struct {
Name string `xml:"Name,omitempty"`
Value string `xml:"Value,omitempty"`
}
var attrs []Attributes
for key, value := range r.Attributes {
attribute := Attributes{
Name: key,
Value: value,
}
attrs = append(attrs, attribute)
}
type MessageAttributes struct {
Name string `xml:"Name,omitempty"`
Value MessageAttribute `xml:"Value,omitempty"`
}
var messageAttrs []MessageAttributes
for key, value := range r.MessageAttributes {
attribute := MessageAttributes{
Name: key,
Value: value,
}
messageAttrs = append(messageAttrs, attribute)
}
e.EncodeToken(start)
// Encode the fields
e.EncodeElement(r.MessageId, xml.StartElement{Name: xml.Name{Local: "MessageId"}})
e.EncodeElement(r.ReceiptHandle, xml.StartElement{Name: xml.Name{Local: "ReceiptHandle"}})
e.EncodeElement(r.MD5OfBody, xml.StartElement{Name: xml.Name{Local: "MD5OfBody"}})
e.EncodeElement(r.Body, xml.StartElement{Name: xml.Name{Local: "Body"}})
e.EncodeElement(attrs, xml.StartElement{Name: xml.Name{Local: "Attribute"}})
e.EncodeElement(messageAttrs, xml.StartElement{Name: xml.Name{Local: "MessageAttribute"}})
e.EncodeToken(xml.EndElement{Name: start.Name})
return nil
}
type ChangeMessageVisibilityResult struct {
Xmlns string `json:"Xmlns" xml:"xmlns,attr"`
Metadata ResponseMetadata `json:"ResponseMetadata" xml:"ResponseMetadata"`
}
func (r ChangeMessageVisibilityResult) GetResult() interface{} {
return nil
}
func (r ChangeMessageVisibilityResult) GetRequestId() string {
return r.Metadata.RequestId
}
/*** Create Queue Response */
type CreateQueueResult struct {
QueueUrl string `json:"QueueUrl" xml:"QueueUrl"`
}
type CreateQueueResponse struct {
Xmlns string `json:"Xmlns" xml:"xmlns,attr"`
Result CreateQueueResult `json:"CreateQueueResult" xml:"CreateQueueResult"`
Metadata ResponseMetadata `json:"ResponseMetadata" xml:"ResponseMetadata"`
}
func (r CreateQueueResponse) GetResult() interface{} {
return r.Result
}
func (r CreateQueueResponse) GetRequestId() string {
return r.Metadata.RequestId
}
/*** List Queues Response */
type ListQueuesResult struct {
// NOTE: the old XML sdks depend on QueueUrl, and the new JSON ones need QueueUrls
QueueUrls []string `json:"QueueUrls" xml:"QueueUrl"`
}
type ListQueuesResponse struct {
Xmlns string `json:"Xmlns" xml:"xmlns,attr"`
Result ListQueuesResult `json:"ListQueuesResult" xml:"ListQueuesResult"`
Metadata ResponseMetadata `json:"ResponseMetadata" xml:"ResponseMetadata"`
}
func (r ListQueuesResponse) GetResult() interface{} {
return r.Result
}
func (r ListQueuesResponse) GetRequestId() string {
return r.Metadata.RequestId
}
/*** Get Queue QueueAttributes ***/
type Attribute struct {
Name string `json:"Name,omitempty" xml:"Name,omitempty"`
Value string `json:"Value,omitempty" xml:"Value,omitempty"`
}
type GetQueueAttributesResult struct {
/* VisibilityTimeout, DelaySeconds, ReceiveMessageWaitTimeSeconds, ApproximateNumberOfMessages
ApproximateNumberOfMessagesNotVisible, CreatedTimestamp, LastModifiedTimestamp, QueueArn */
Attrs []Attribute `json:"Attributes,omitempty" xml:"Attribute,omitempty"`
}
type GetQueueAttributesResponse struct {
Xmlns string `json:"Xmlns" xml:"xmlns,attr"`
Result GetQueueAttributesResult `json:"GetQueueAttributesResult" xml:"GetQueueAttributesResult"`
Metadata ResponseMetadata `json:"ResponseMetadata" xml:"ResponseMetadata"`
}
func (r GetQueueAttributesResponse) GetResult() interface{} {
result := map[string]string{}
for _, attr := range r.Result.Attrs {
result[attr.Name] = attr.Value
}
return map[string]map[string]string{"Attributes": result}
}
func (r GetQueueAttributesResponse) GetRequestId() string {
return r.Metadata.RequestId
}
/*** Send Message Response */
type SendMessageResult struct {
MD5OfMessageAttributes string `json:"MD5OfMessageAttributes,omitempty" xml:"MD5OfMessageAttributes,omitempty"`
MD5OfMessageBody string `json:"MD5OfMessageBody" xml:"MD5OfMessageBody"`
MessageId string `json:"MessageId" xml:"MessageId"`
SequenceNumber string `json:"SequenceNumber,omitempty" xml:"SequenceNumber,omitempty"`
}
type SendMessageResponse struct {
Xmlns string `json:"Xmlns" xml:"xmlns,attr"`
Result SendMessageResult `json:"SendMessageResult" xml:"SendMessageResult"`
Metadata ResponseMetadata `json:"ResponseMetadata" xml:"ResponseMetadata"`
}
func (r SendMessageResponse) GetResult() interface{} {
return r.Result
}
func (r SendMessageResponse) GetRequestId() string {
return r.Metadata.RequestId
}
/*** Delete Message Response */
type DeleteMessageResponse struct {
Xmlns string `json:"Xmlns" xml:"xmlns,attr"`
Metadata ResponseMetadata `json:"ResponseMetadata" xml:"ResponseMetadata"`
}
func (r DeleteMessageResponse) GetResult() interface{} {
return nil
}
func (r DeleteMessageResponse) GetRequestId() string {
return r.Metadata.RequestId
}
/*** Get Queue Url Response */
type GetQueueUrlResult struct {
QueueUrl string `json:"QueueUrl,omitempty" xml:"QueueUrl,omitempty"`
}
type GetQueueUrlResponse struct {
Xmlns string `json:"Xmlns" xml:"xmlns,attr"`
Result GetQueueUrlResult `json:"GetQueueUrlResult" xml:"GetQueueUrlResult"`
Metadata ResponseMetadata `json:"ResponseMetadata" xml:"ResponseMetadata"`
}
func (r GetQueueUrlResponse) GetResult() interface{} {
return r.Result
}
func (r GetQueueUrlResponse) GetRequestId() string {
return r.Metadata.RequestId
}
type SendMessageBatchResultEntry struct {
Id string `json:"Id" xml:"Id"`
MessageId string `json:"MessageId" xml:"MessageId"`
MD5OfMessageBody string `json:"MD5OfMessageBody,omitempty" xml:"MD5OfMessageBody,omitempty"`
MD5OfMessageAttributes string `json:"MD5OfMessageAttributes,omitempty" xml:"MD5OfMessageAttributes,omitempty"`
SequenceNumber string `json:"SequenceNumber" xml:"SequenceNumber"`
}
/*** Send Message Batch Response */
type SendMessageBatchResponse struct {
Xmlns string `json:"Xmlns" xml:"xmlns,attr"`
Result SendMessageBatchResult `json:"SendMessageBatchResult" xml:"SendMessageBatchResult"`
Metadata ResponseMetadata `json:"ResponseMetadata" xml:"ResponseMetadata"`
}
type SendMessageBatchResult struct {
Entry []SendMessageBatchResultEntry `json:"Successful" xml:"SendMessageBatchResultEntry"`
Error []BatchResultErrorEntry `json:"Failed,omitempty" xml:"BatchResultErrorEntry,omitempty"`
}
func (r SendMessageBatchResponse) GetResult() interface{} {
return r.Result
}
func (r SendMessageBatchResponse) GetRequestId() string {
return r.Metadata.RequestId
}
type BatchResultErrorEntry struct {
Code string `json:"Code" xml:"Code"`
Id string `json:"Id" xml:"Id"`
Message string `json:"Message,omitempty" xml:"Message,omitempty"`
SenderFault bool `json:"SenderFault" xml:"SenderFault"`
}
type SetQueueAttributesResponse struct {
Xmlns string `json:"Xmlns" xml:"xmlns,attr"`
Metadata ResponseMetadata `json:"ResponseMetadata" xml:"ResponseMetadata"`
}
func (r SetQueueAttributesResponse) GetResult() interface{} {
return nil
}
func (r SetQueueAttributesResponse) GetRequestId() string {
return r.Metadata.RequestId
}
/*** Purge Queue Response */
type PurgeQueueResponse struct {
Xmlns string `json:"Xmlns" xml:"xmlns,attr"`
Metadata ResponseMetadata `json:"ResponseMetadata" xml:"ResponseMetadata"`
}
func (r PurgeQueueResponse) GetResult() interface{} {
return nil
}
func (r PurgeQueueResponse) GetRequestId() string {
return r.Metadata.RequestId
}
/*** Delete Queue Response */
type DeleteQueueResponse struct {
Xmlns string `json:"Xmlns" xml:"xmlns,attr"`
Metadata ResponseMetadata `json:"ResponseMetadata" xml:"ResponseMetadata"`
}
func (r DeleteQueueResponse) GetResult() interface{} {
return nil
}
func (r DeleteQueueResponse) GetRequestId() string {
return r.Metadata.RequestId
}
/*** Delete Message Batch Response ***/
type DeleteMessageBatchResultEntry struct {
Id string `json:"Id" xml:"Id"`
}
type DeleteMessageBatchResult struct {
Successful []DeleteMessageBatchResultEntry `json:"Successful" xml:"DeleteMessageBatchResultEntry"`
Failed []BatchResultErrorEntry `json:"Failed,omitempty" xml:"BatchResultErrorEntry,omitempty"`
}
type DeleteMessageBatchResponse struct {
Xmlns string `json:"Xmlns" xml:"xmlns,attr"`
Result DeleteMessageBatchResult `json:"DeleteMessageBatchResult" xml:"DeleteMessageBatchResult"`
Metadata ResponseMetadata `json:"ResponseMetadata" xml:"ResponseMetadata"`
}
func (r DeleteMessageBatchResponse) GetResult() interface{} {
return r.Result
}
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
}