Hi, thanks for setting up this community. I'm not a Lemmy source contributer but I like to read open sources. Here is a very simplified web application (including Lemmy) architecture overview and I hope this text helps for some newbies:
- A user agent (web browser, mobile app, etc.) sends an HTTP request to a Lemmy instance.
- The lemmy instance examines the HTTP request and dispatches the request to a relevant function called controller. The mapping from a path in the URL to a function is called a router - see https://github.com/LemmyNet/lemmy/blob/0.19.3/src/api_routes_http.rs for example.
- The controller makes an HTTP response for the request and returns it to the user agent.
- The user agent displays the returned response to the user.
To find an controller from a path in the router, just grep (or a similar search function you use) the Lemmy source. For example, if I want to know how GET /user/export_settings
works, I'll run these commands:
$ git clone https://github.com/LemmyNet/lemmy/ # if you haven't download the source yet
$ cd lemmy
$ rg export_settings
src/api_routes_http.rs
131: user_settings_backup::{export_settings, import_settings},
274: web::resource("/user/export_settings")
276: .route(web::get().to(export_settings)),
crates/apub/src/api/user_settings_backup.rs
68:pub async fn export_settings(
301: use crate::api::user_settings_backup::{export_settings, import_settings};
366: let backup = export_settings(export_user.clone(), context.reset_request_count()).await?;
402: let mut backup = export_settings(export_user.clone(), context.reset_request_count()).await?;
So we got the relevant route and the controller definitions very quickly. Settings to be exported are defined as a struct UserSettingsBackup
. The controller is defined as pub async fn export_settings
and it converts the struct to a JSON.
Rust might not be a easy programming language but the official text (calld The Book is very friendly for newbies, so don't hesitate to read and to write a simple program like guessing game.