1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
|
using System.Collections.Frozen;
using LibMatrix.HomeserverEmulator.Extensions;
using LibMatrix.HomeserverEmulator.Services;
using Microsoft.AspNetCore.Mvc;
namespace LibMatrix.HomeserverEmulator.Controllers.Rooms;
[ApiController]
[Route("/_matrix/client/{version}/rooms/{roomId}/state")]
public class RoomStateController(ILogger<RoomStateController> logger, TokenService tokenService, UserStore userStore, RoomStore roomStore) : ControllerBase {
[HttpGet("")]
public async Task<FrozenSet<StateEventResponse>> GetState(string roomId) {
var token = tokenService.GetAccessToken(HttpContext);
if (token == null)
throw new MatrixException() {
ErrorCode = "M_MISSING_TOKEN",
Error = "Missing token"
};
var user = await userStore.GetUserByToken(token);
if (user == null)
throw new MatrixException() {
ErrorCode = "M_UNKNOWN_TOKEN",
Error = "No such user"
};
var room = roomStore.GetRoomById(roomId);
if (room == null)
throw new MatrixException() {
ErrorCode = "M_NOT_FOUND",
Error = "Room not found"
};
return room.State;
}
[HttpGet("{eventType}")]
public async Task<StateEventResponse> GetState(string roomId, string eventType) {
return await GetState(roomId, eventType, "");
}
[HttpGet("{eventType}/{stateKey}")]
public async Task<StateEventResponse> GetState(string roomId, string eventType, string stateKey) {
var token = tokenService.GetAccessToken(HttpContext);
if (token == null)
throw new MatrixException() {
ErrorCode = "M_MISSING_TOKEN",
Error = "Missing token"
};
var user = await userStore.GetUserByToken(token);
if (user == null)
throw new MatrixException() {
ErrorCode = "M_UNKNOWN_TOKEN",
Error = "No such user"
};
var room = roomStore.GetRoomById(roomId);
if (room == null)
throw new MatrixException() {
ErrorCode = "M_NOT_FOUND",
Error = "Room not found"
};
var stateEvent = room.State.FirstOrDefault(x => x.Type == eventType && x.StateKey == stateKey);
if (stateEvent == null)
throw new MatrixException() {
ErrorCode = "M_NOT_FOUND",
Error = "Event not found"
};
return stateEvent;
}
[HttpPut("{eventType}")]
public async Task<EventIdResponse> SetState(string roomId, string eventType, [FromBody] StateEvent request) {
return await SetState(roomId, eventType, "", request);
}
[HttpPut("{eventType}/{stateKey}")]
public async Task<EventIdResponse> SetState(string roomId, string eventType, string stateKey, [FromBody] StateEvent request) {
var token = tokenService.GetAccessToken(HttpContext);
if (token == null)
throw new MatrixException() {
ErrorCode = "M_MISSING_TOKEN",
Error = "Missing token"
};
var user = await userStore.GetUserByToken(token);
if (user == null)
throw new MatrixException() {
ErrorCode = "M_UNKNOWN_TOKEN",
Error = "No such user"
};
var room = roomStore.GetRoomById(roomId);
if (room == null)
throw new MatrixException() {
ErrorCode = "M_NOT_FOUND",
Error = "Room not found"
};
var evt = room.SetStateInternal(request.ToStateEvent(user, room));
evt.Type = eventType;
evt.StateKey = stateKey;
return new EventIdResponse(){
EventId = evt.EventId
};
}
}
|