defmodule MatrixAppServiceWeb.V1.TransactionController do @moduledoc """ Controller for transactions. """ use MatrixAppServiceWeb, :controller # %{"access_token" => access_token, # "events" => [ # %{"age" => 199, # "content" => %{ # "body" => "test", # "msgtype" => "m.room.message"}, # "event_id" => "$pMDN7TcsCapjLRYoITwryk0anpQGs60y2Eng3lxropc", # "origin_server_ts" => 1588950428966, # "room_id" => "!SrVtqmyqzuaMnfVImP:matrix.imago.local", # "sender" => "@alice:matrix.imago.local", # "type" => "m.room.message", # "unsigned" => %{"age" => 199}, # "user_id" => "@alice:matrix.imago.local"}], # "txn_id" => "269"} defp create_event( %{ "age" => age, "content" => content, "event_id" => event_id, "origin_server_ts" => origin_server_ts, "room_id" => room_id, "sender" => sender, "state_key" => state_key, "type" => type, "unsigned" => unsigned, "user_id" => user_id }, adapter ) do event = %MatrixAppService.Event{ age: age, content: content, event_id: event_id, origin_server_ts: origin_server_ts, room_id: room_id, sender: sender, state_key: state_key, type: type, unsigned: unsigned, user_id: user_id } adapter.new_event(event) end defp create_event( %{ "age" => age, "content" => content, "event_id" => event_id, "origin_server_ts" => origin_server_ts, "room_id" => room_id, "sender" => sender, "type" => type, "unsigned" => unsigned, "user_id" => user_id }, adapter ) do event = %MatrixAppService.Event{ age: age, content: content, event_id: event_id, origin_server_ts: origin_server_ts, room_id: room_id, sender: sender, state_key: nil, type: type, unsigned: unsigned, user_id: user_id } adapter.new_event(event) end @doc """ https://matrix.org/docs/spec/application_service/r0.1.2#put-matrix-app-v1-transactions-txnid """ def push(conn, %{"events" => events}) do adapter = conn.private[:transaction_adapter] || MatrixAppServiceWeb.Endpoint.config(:transaction_adapter) || raise "MatrixAppService: config key room_adapter missing" Enum.each(events, &create_event(&1, adapter)) send_resp(conn, 200, "{}") end end