Skip to content

Commit 5050a99

Browse files
committed
add post and put for saved areas to enable one by one edits
1 parent e693736 commit 5050a99

5 files changed

Lines changed: 239 additions & 7 deletions

File tree

docs/rest/v4/README.md

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,8 +11,7 @@ The latest and recommended version of the BTCMap API, offering improved performa
1111
- **[Events](events.md)** - Fetch events.
1212
- **[Invoices](invoices.md)** - Check invoice status for boosts, comments and other paywalled features.
1313
- **[Users](users.md)** - Get authenticated user information.
14-
### Planned
15-
- **[Areas](areas.md)** - Fetch areas.
14+
- **[Areas](areas.md)** - Fetch areas and manage saved areas.
1615
### Proposed
1716
- Need something extra? Let us know!
1817

docs/rest/v4/areas.md

Lines changed: 105 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,111 @@ This document describes the endpoints for interacting with areas in REST API v4.
44

55
## Available Endpoints
66

7-
- [Search](#search)
8-
- [Get Area](#get-area)
7+
- [Get Saved Areas](#get-saved-areas)
8+
- [Set Saved Areas](#set-saved-areas)
9+
- [Add Saved Area](#add-saved-area)
10+
- [Delete Saved Area](#delete-saved-area)
11+
12+
### Get Saved Areas
13+
14+
Returns the authenticated user's saved areas.
15+
16+
```bash
17+
curl https://api.btcmap.org/v4/areas/saved
18+
```
19+
20+
**Requires authentication.** See [Users API](users.md) for details.
21+
22+
#### Examples
23+
24+
```json
25+
[
26+
{
27+
"id": 123,
28+
"name": "Grand Paris",
29+
"type": "community",
30+
"url_alias": "grand-paris",
31+
"icon": "https://static.btcmap.org/images/communities/grand-paris.jpg",
32+
"website_url": "https://btcmap.org/community/grand-paris"
33+
}
34+
]
35+
```
36+
37+
### Set Saved Areas
38+
39+
Replaces the authenticated user's saved areas list.
40+
41+
```bash
42+
curl -X PUT https://api.btcmap.org/v4/areas/saved \
43+
-H "Authorization: Bearer {token}" \
44+
-d '[123, 456, 789]'
45+
```
46+
47+
**Requires authentication.** See [Users API](users.md) for details.
48+
49+
#### Request Body
50+
51+
| Type | Example | Description |
52+
|------|---------|-------------|
53+
| Array of Numbers | `[123, 456]` | Array of area IDs to save. |
54+
55+
#### Response
56+
57+
Returns the updated list of saved area IDs.
58+
59+
```json
60+
[123, 456, 789]
61+
```
62+
63+
### Add Saved Area
64+
65+
Adds a single area to the authenticated user's saved areas.
66+
67+
```bash
68+
curl -X POST https://api.btcmap.org/v4/areas/saved \
69+
-H "Authorization: Bearer {token}" \
70+
-d 123
71+
```
72+
73+
**Requires authentication.** See [Users API](users.md) for details.
74+
75+
#### Request Body
76+
77+
| Type | Example | Description |
78+
|------|---------|-------------|
79+
| Number | `123` | Area ID to add. |
80+
81+
#### Response
82+
83+
Returns the updated list of saved area IDs. If the area is already saved, the list is unchanged.
84+
85+
```json
86+
[123, 456, 789]
87+
```
88+
89+
### Delete Saved Area
90+
91+
Removes a single area from the authenticated user's saved areas.
92+
93+
```bash
94+
curl -X DELETE https://api.btcmap.org/v4/areas/saved/123
95+
```
96+
97+
**Requires authentication.** See [Users API](users.md) for details.
98+
99+
#### Path Parameters
100+
101+
| Parameter | Type | Example | Description |
102+
|-----------|------|---------|-------------|
103+
| `id` | Number | `123` | **Required**. Area ID to remove. |
104+
105+
#### Response
106+
107+
Returns the updated list of saved area IDs.
108+
109+
```json
110+
[456, 789]
111+
```
9112

10113
### Search
11114

docs/rest/v4/places.md

Lines changed: 103 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,10 @@ This document describes the endpoints for interacting with places in REST API v4
88
- [Search](#search)
99
- [Fetch Place](#fetch-place)
1010
- [Fetch Place Comments](#fetch-place-comments)
11+
- [Get Saved Places](#get-saved-places)
12+
- [Set Saved Places](#set-saved-places)
13+
- [Add Saved Place](#add-saved-place)
14+
- [Delete Saved Place](#delete-saved-place)
1115

1216
### Chronological Sync
1317

@@ -346,3 +350,102 @@ curl GET https://api.btcmap.org/v4/places/120/areas?type=community
346350
}
347351
]
348352
```
353+
354+
### Get Saved Places
355+
356+
Returns the authenticated user's saved places.
357+
358+
```bash
359+
curl https://api.btcmap.org/v4/places/saved
360+
```
361+
362+
**Requires authentication.** See [Users API](users.md) for details.
363+
364+
#### Examples
365+
366+
```json
367+
[
368+
{
369+
"id": 4829,
370+
"lat": 53.2689435,
371+
"lon": 9.8538715,
372+
"name": "Der Schafstall"
373+
}
374+
]
375+
```
376+
377+
### Set Saved Places
378+
379+
Replaces the authenticated user's saved places list.
380+
381+
```bash
382+
curl -X PUT https://api.btcmap.org/v4/places/saved \
383+
-H "Authorization: Bearer {token}" \
384+
-d '[123, 456, 789]'
385+
```
386+
387+
**Requires authentication.** See [Users API](users.md) for details.
388+
389+
#### Request Body
390+
391+
| Type | Example | Description |
392+
|------|---------|-------------|
393+
| Array of Numbers | `[123, 456]` | Array of place IDs to save. |
394+
395+
#### Response
396+
397+
Returns the updated list of saved place IDs.
398+
399+
```json
400+
[123, 456, 789]
401+
```
402+
403+
### Add Saved Place
404+
405+
Adds a single place to the authenticated user's saved places.
406+
407+
```bash
408+
curl -X POST https://api.btcmap.org/v4/places/saved \
409+
-H "Authorization: Bearer {token}" \
410+
-d 123
411+
```
412+
413+
**Requires authentication.** See [Users API](users.md) for details.
414+
415+
#### Request Body
416+
417+
| Type | Example | Description |
418+
|------|---------|-------------|
419+
| Number | `123` | Place ID to add. |
420+
421+
#### Response
422+
423+
Returns the updated list of saved place IDs. If the place is already saved, the list is unchanged.
424+
425+
```json
426+
[123, 456, 789]
427+
```
428+
429+
### Delete Saved Place
430+
431+
Removes a single place from the authenticated user's saved places.
432+
433+
```bash
434+
curl -X DELETE https://api.btcmap.org/v4/places/saved/123
435+
```
436+
437+
**Requires authentication.** See [Users API](users.md) for details.
438+
439+
#### Path Parameters
440+
441+
| Parameter | Type | Example | Description |
442+
|-----------|------|---------|-------------|
443+
| `id` | Number | `123` | **Required**. Place ID to remove. |
444+
445+
#### Response
446+
447+
Returns the updated list of saved place IDs.
448+
449+
```json
450+
[456, 789]
451+
```

src/main.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -182,9 +182,11 @@ async fn main() -> Result<()> {
182182
scope("areas")
183183
.service(rest::v4::areas::get_saved)
184184
.service(rest::v4::areas::put_saved)
185+
.service(rest::v4::areas::post_saved)
186+
.service(rest::v4::areas::delete_saved)
185187
.service(rest::v4::areas::get_by_id_top_editors)
186-
.service(rest::v4::areas::get)
187-
.service(rest::v4::areas::get_by_id),
188+
.service(rest::v4::areas::get_by_id)
189+
.service(rest::v4::areas::get),
188190
)
189191
.service(scope("dashboard").service(rest::v4::dashboard::get))
190192
.service(scope("top-editors").service(rest::v4::top_editors::get))

src/rest/v4/areas.rs

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ use crate::rest::v4::top_editors::{
88
};
99
use crate::service;
1010
use crate::Error;
11-
use actix_web::{get, put, web::Data, web::Json, web::Path, web::Query};
11+
use actix_web::{delete, get, post, put, web::Data, web::Json, web::Path, web::Query};
1212
use serde::{Deserialize, Serialize};
1313
use time::OffsetDateTime;
1414

@@ -198,6 +198,31 @@ pub async fn put_saved(auth: Auth, args: Json<Vec<i64>>, pool: Data<MainPool>) -
198198
Ok(actix_web::web::Json(args.into_inner()))
199199
}
200200

201+
#[post("/saved")]
202+
pub async fn post_saved(auth: Auth, args: Json<i64>, pool: Data<MainPool>) -> Res<Vec<i64>> {
203+
let user = auth.user.ok_or(RestApiError::unauthorized())?;
204+
let mut saved_areas = user.saved_areas.clone();
205+
if !saved_areas.contains(&args) {
206+
saved_areas.push(args.into_inner());
207+
}
208+
db::main::user::queries::set_saved_areas(user.id, &saved_areas, &pool)
209+
.await
210+
.map_err(|_| RestApiError::database())?;
211+
Ok(actix_web::web::Json(saved_areas))
212+
}
213+
214+
#[delete("/saved/{id}")]
215+
pub async fn delete_saved(auth: Auth, path: Path<i64>, pool: Data<MainPool>) -> Res<Vec<i64>> {
216+
let user = auth.user.ok_or(RestApiError::unauthorized())?;
217+
let id = path.into_inner();
218+
let mut saved_areas = user.saved_areas.clone();
219+
saved_areas.retain(|x| *x != id);
220+
db::main::user::queries::set_saved_areas(user.id, &saved_areas, &pool)
221+
.await
222+
.map_err(|_| RestApiError::database())?;
223+
Ok(actix_web::web::Json(saved_areas))
224+
}
225+
201226
#[derive(Deserialize)]
202227
pub struct GetTopEditorsForAreaArgs {
203228
period_start: Option<String>,

0 commit comments

Comments
 (0)