+5

Sử dụng API Mattermost với Ruby on Rails

Mattermost

Mattermost là Slack-alternative mã nguồn mở, phát triển để thay thế phần mềm dịch vụ nhắn tin. Masttermost mang lại môi trường giao tiếp cho một nhóm phát triển đến từ quy mô nhỏ đến lớn. Nó được viết bằng Golang và React và chạy trên môi trường nhị phân Linux theo giấy phép của MIT, MySQL và Postgres.

API Mattermost

Mở đầu

Mattermost Web Services API được sử dụng bởi Mattermost clients và các ứng dụng bên thứ ba để tương tác với máy chủ. Hiện nay đã hỗ trỡ sẵn kết nối API của Javascript và Golang.

Schema

Tất cả quyền truy cập API đều thông qua HTTP hoặc HTTPS request tại your-mattermost-url.com/api/v4 . Và tất cả các request và response bodies đều là application/json

Authentication

Có nhiều cách để xác thực dựa trên Mattermost API. Make an HTTP POST to with a JSON body indicating the user’s login_id, password and optionally the MFA token. The login_id can be an email, username or an AD/LDAP ID depending on the system's configuration. Tạo một HTTP với phương thức POST gửi tới your-mattermost-url.com/api/v4/users/login với JSON body bao gồm login_id, password và có thể bao gồm token MFA. Login_id có thể là email, username hoặc một AD/LDAP ID phụ thuộc vào cấu hình hệ thống.

Một cách lấy token bằng email và password bằng code Ruby

def get_token
    if @access_token.blank?

    end
    uri = "#{ENV['MATTERMOST_URL']}/api/v4/users/login"
    body = { login_id: @login_id, password: @password }.to_json
    response = run_request(:post, uri, body, nil)
    return unless response&.success?

    SS.config.gws.mattermost["access_token"] = response.headers["token"] if SS.config.gws.mattermost
    response.headers["token"] if response.headers
end

Error

Tất cả các lỗi sẽ trả về một HTTP response code thích hợp cùng với JSON body:

{
    "id": "the.error.id",
    "message": "Something went wrong", // the reason for the error
    "request_id": "", // the ID of the request
    "status_code": 0, // the HTTP status code
    "is_oauth": false // whether the error is OAuth specific
}

Rate Limiting

Bất cứ khi nào thực hiện một yêu cầu HTTP tới Mattermost API, bạn có thể nhận thấy các eaders sau được bao gồm trong response:

X-Ratelimit-Limit: 10
X-Ratelimit-Remaining: 9
X-Ratelimit-Reset: 1441983590
  • X-Ratelimit-Limit: Số request tối đa có thể gửi trong một giây.
  • X-Ratelimit-Remaining: Số request còn lại trong current window.
  • X-Ratelimit-Reset: Khoảng thời gian còn lại trước khi giới hạn request được reset.

ENDPOINTS

Ví dụ về một endpoints: Get team unreads for a user

Lấy số lượng tin nhắn chưa đọc được mentions trong một team của một user.

def get_unread(user_id)
    uri = "#{ENV['MATTERMOST_URL']}/api/v4/users/#{user_id}/teams/unread"
    response = run_request(:get, uri, nil, nil)
    return unless response&.success?

    JSON.parse(response.body)&.pluck("mention_count")&.sum
end
  • Code 200: Team unreads retrieval successful
  • Code 400: Parameters bị thiếu hoặc không hợp lệ trong URL hoặc request body.
  • Code 401: Access token không được cung cấp.
  • Code 403: Không có quyền thích hợp.

Tất cả các endpoints được cung cấp chi tiết ở đây: GET ALL ENDPOINT MATTERMOST


Một số hàm hỗ trợ call API trong rails

def run_request(method, url, body, headers)
  begin
    http_client = create_http_client(url)

    http_client.run_request(method, nil, body, headers) do |request|
      request.headers["Accept"] = "*/*"
      request.headers["Authorization"] = "Bearer #{@access_token}"
      request.headers["content-type"] = "application/json"
    end
  rescue Faraday::Error::ConnectionFailed => e
    Rails.logger.error("Connection failed: Failed to open TCP connection to Mattermost server host.")
    return
  end
end
def create_http_client(url)
  http_client = Faraday.new(url: url) do |builder|
    builder.request :url_encoded
    builder.response :logger, Rails.logger
    builder.adapter Faraday.default_adapter
  end
  http_client.headers[:user_agent] += " (SHIRASAGI/#{SS.version}; PID/#{Process.pid})"
  http_client
end

Kết bài

Trên đây là một vài thông tin cơ bản về mã nguồn mở Mattermost và cách cấu hình thực hiện giao tiếp HTTP cơ bản của một ứng dụng Ruby on Rails tương tác với server Mattermost.

Còn rất nhiều thứ có thể khai thác từ mã ngoài mở này, dưới đây là link tham khảo và khám phá:


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.