<feed xmlns='http://www.w3.org/2005/Atom'>
<title>wikiapiserver, branch master</title>
<subtitle>Small server utility to make working with wikimedia enterprise api a little bit easier.</subtitle>
<link rel='alternate' type='text/html' href='https://git.iamfabulous.de/wikiapiserver/'/>
<entry>
<title>chore: add systemd user service unit for wikiapiserver</title>
<updated>2026-06-26T02:09:22+00:00</updated>
<author>
<name>wikiapiserver</name>
</author>
<published>2026-06-26T02:09:22+00:00</published>
<link rel='alternate' type='text/html' href='https://git.iamfabulous.de/wikiapiserver/commit/?id=6e18208bbf18dd2a06280f550bffd18cc93ff3b1'/>
<id>6e18208bbf18dd2a06280f550bffd18cc93ff3b1</id>
<content type='text'>
Starts the binary from the project directory with automatic
restart on failure. Install with:
  cp wikiapiserver.service ~/.config/systemd/user/
  systemctl --user daemon-reload
  systemctl --user start wikiapiserver
  systemctl --user enable wikiapiserver
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Starts the binary from the project directory with automatic
restart on failure. Install with:
  cp wikiapiserver.service ~/.config/systemd/user/
  systemctl --user daemon-reload
  systemctl --user start wikiapiserver
  systemctl --user enable wikiapiserver
</pre>
</div>
</content>
</entry>
<entry>
<title>fix: filter to English Wikipedia via POST with filter body</title>
<updated>2026-06-25T23:32:11+00:00</updated>
<author>
<name>wikiapiserver</name>
</author>
<published>2026-06-25T23:32:11+00:00</published>
<link rel='alternate' type='text/html' href='https://git.iamfabulous.de/wikiapiserver/commit/?id=46bcf2b5e837bfbc957db60a5c674742f3916083'/>
<id>46bcf2b5e837bfbc957db60a5c674742f3916083</id>
<content type='text'>
The structured contents API requires a POST request with the filter
in the JSON body to narrow results:
  {"filters": [{"field": "in_language.identifier", "value": "en"}]}

Replaces the non-functional query-string filter parameter.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The structured contents API requires a POST request with the filter
in the JSON body to narrow results:
  {"filters": [{"field": "in_language.identifier", "value": "en"}]}

Replaces the non-functional query-string filter parameter.
</pre>
</div>
</content>
</entry>
<entry>
<title>fix: remove invalid project filter from article API call</title>
<updated>2026-06-25T23:20:29+00:00</updated>
<author>
<name>wikiapiserver</name>
</author>
<published>2026-06-25T23:20:29+00:00</published>
<link rel='alternate' type='text/html' href='https://git.iamfabulous.de/wikiapiserver/commit/?id=e7bbed2d3b7d06700b0b4d9009f695e0cdf03e40'/>
<id>e7bbed2d3b7d06700b0b4d9009f695e0cdf03e40</id>
<content type='text'>
The filters[project]=en.wikipedia.org parameter caused timeouts and
empty responses. The filter value was incorrect for the Wikimedia
Enterprise API.

Articles from 404-list.test that genuinely don't exist on Wikipedia
(e.g. TV episodes without standalone articles) still return 404 —
this is expected behavior from the upstream API.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
The filters[project]=en.wikipedia.org parameter caused timeouts and
empty responses. The filter value was incorrect for the Wikimedia
Enterprise API.

Articles from 404-list.test that genuinely don't exist on Wikipedia
(e.g. TV episodes without standalone articles) still return 404 —
this is expected behavior from the upstream API.
</pre>
</div>
</content>
</entry>
<entry>
<title>fix: pass through upstream HTTP status codes from /article</title>
<updated>2026-06-25T20:00:25+00:00</updated>
<author>
<name>wikiapiserver</name>
</author>
<published>2026-06-25T20:00:25+00:00</published>
<link rel='alternate' type='text/html' href='https://git.iamfabulous.de/wikiapiserver/commit/?id=4907cfb72ef69fb94c49cfb484a5a2907db0dee8'/>
<id>4907cfb72ef69fb94c49cfb484a5a2907db0dee8</id>
<content type='text'>
- Non-2xx responses (404, 429, 5xx) are now forwarded to the
  client with their original status code and response body
- Increased WriteTimeout to 45s to accommodate slow upstream API
- Added explicit resp.Body.Close() and response flush before return
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- Non-2xx responses (404, 429, 5xx) are now forwarded to the
  client with their original status code and response body
- Increased WriteTimeout to 45s to accommodate slow upstream API
- Added explicit resp.Body.Close() and response flush before return
</pre>
</div>
</content>
</entry>
<entry>
<title>chore: add SQL migration files for production schema</title>
<updated>2026-06-25T19:37:16+00:00</updated>
<author>
<name>wikiapiserver</name>
</author>
<published>2026-06-25T19:37:16+00:00</published>
<link rel='alternate' type='text/html' href='https://git.iamfabulous.de/wikiapiserver/commit/?id=a67cf297df78521d1c2dee0dc2746a8046675b56'/>
<id>a67cf297df78521d1c2dee0dc2746a8046675b56</id>
<content type='text'>
- sql/000_widen_tokens.sql: widen token columns to TEXT, add
  refresh_token_created and access_token_created timestamps
- sql/001_add_api_logs.sql: create api_logs table for request logging
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- sql/000_widen_tokens.sql: widen token columns to TEXT, add
  refresh_token_created and access_token_created timestamps
- sql/001_add_api_logs.sql: create api_logs table for request logging
</pre>
</div>
</content>
</entry>
<entry>
<title>feat: log article API failures to database</title>
<updated>2026-06-25T19:35:50+00:00</updated>
<author>
<name>wikiapiserver</name>
</author>
<published>2026-06-25T19:35:50+00:00</published>
<link rel='alternate' type='text/html' href='https://git.iamfabulous.de/wikiapiserver/commit/?id=795fb7facf403f4e3d452d2e08ba11f98e8ee997'/>
<id>795fb7facf403f4e3d452d2e08ba11f98e8ee997</id>
<content type='text'>
- Created api_logs table (username, article_name, status_code,
  response_time_ms, error, request_url)
- GetArticle logs failures (network errors and non-2xx responses)
  with timing, status code, and response body
- Successful requests are not logged
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
- Created api_logs table (username, article_name, status_code,
  response_time_ms, error, request_url)
- GetArticle logs failures (network errors and non-2xx responses)
  with timing, status code, and response body
- Successful requests are not logged
</pre>
</div>
</content>
</entry>
<entry>
<title>chore: add wikiapiserver binary to .gitignore and remove from history</title>
<updated>2026-06-25T19:27:23+00:00</updated>
<author>
<name>wikiapiserver</name>
</author>
<published>2026-06-25T19:27:23+00:00</published>
<link rel='alternate' type='text/html' href='https://git.iamfabulous.de/wikiapiserver/commit/?id=550d382014b5f3476caed167025d6c4be16d844d'/>
<id>550d382014b5f3476caed167025d6c4be16d844d</id>
<content type='text'>
Binary was tracked for several commits, bloating the repo.
Removed all references via git filter-repo.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Binary was tracked for several commits, bloating the repo.
Removed all references via git filter-repo.
</pre>
</div>
</content>
</entry>
<entry>
<title>fix: limit article search to English Wikipedia</title>
<updated>2026-06-25T14:19:17+00:00</updated>
<author>
<name>wikiapiserver</name>
</author>
<published>2026-06-25T14:19:17+00:00</published>
<link rel='alternate' type='text/html' href='https://git.iamfabulous.de/wikiapiserver/commit/?id=19ec2891109eb0dc9074fcd5f6bdc4ef3f1bb0b4'/>
<id>19ec2891109eb0dc9074fcd5f6bdc4ef3f1bb0b4</id>
<content type='text'>
Add limit=1&amp;filters[project]=en.wikipedia.org to structured
contents API call.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Add limit=1&amp;filters[project]=en.wikipedia.org to structured
contents API call.
</pre>
</div>
</content>
</entry>
<entry>
<title>feat: GET /article endpoint proxies Wikimedia structured contents</title>
<updated>2026-06-25T13:42:32+00:00</updated>
<author>
<name>wikiapiserver</name>
</author>
<published>2026-06-25T13:42:32+00:00</published>
<link rel='alternate' type='text/html' href='https://git.iamfabulous.de/wikiapiserver/commit/?id=81258d39db6530699194f860206528c6f09a5238'/>
<id>81258d39db6530699194f860206528c6f09a5238</id>
<content type='text'>
GET /article?username=alice&amp;name=en.wikipedia/Sun
→ proxies to api.enterprise.wikimedia.com/v2/structured-contents/{name}
with Authorization: Bearer &lt;access_token&gt;

Returns 401 for unknown users, 400 if params missing,
and passes through the upstream HTTP status on errors.
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
GET /article?username=alice&amp;name=en.wikipedia/Sun
→ proxies to api.enterprise.wikimedia.com/v2/structured-contents/{name}
with Authorization: Bearer &lt;access_token&gt;

Returns 401 for unknown users, 400 if params missing,
and passes through the upstream HTTP status on errors.
</pre>
</div>
</content>
</entry>
<entry>
<title>feat: add GET /token endpoint</title>
<updated>2026-06-25T13:02:22+00:00</updated>
<author>
<name>wikiapiserver</name>
</author>
<published>2026-06-25T13:02:22+00:00</published>
<link rel='alternate' type='text/html' href='https://git.iamfabulous.de/wikiapiserver/commit/?id=1a25a89dfeeb7ed5af4df77907b65f99bdf5399a'/>
<id>1a25a89dfeeb7ed5af4df77907b65f99bdf5399a</id>
<content type='text'>
Returns access_token and valid_until for a given username.
GET /token?username=foo → {"access_token": "...", "valid_until": "2026-06-26T15:00:51Z"}
</content>
<content type='xhtml'>
<div xmlns='http://www.w3.org/1999/xhtml'>
<pre>
Returns access_token and valid_until for a given username.
GET /token?username=foo → {"access_token": "...", "valid_until": "2026-06-26T15:00:51Z"}
</pre>
</div>
</content>
</entry>
</feed>
