Implements the device lookup/report API DeviceInfo talks to: search-device (v1 deprecated but sharing v2's lookup logic internally, v2 exact-match with optional per-unit CMF color resolution), report-device-info, and the device-names self-update feed. Includes a migration script for anyone coming from an older JSON-file version, plus docs/CMF_COLOR.md on why the color-code table has to be hand-maintained.
60 lines
2.8 KiB
Markdown
60 lines
2.8 KiB
Markdown
# device-info-server
|
|
|
|
Backend for [AndroidDeviceInfo](../): device name/image lookup, per-unit color
|
|
(CMF) resolution, report ingestion, and a self-update feed for the library's
|
|
bundled device-names database. SQLite-backed via
|
|
[`better-sqlite3`](https://github.com/WiseLibs/better-sqlite3).
|
|
|
|
This is a lean reference implementation — no auth, rate limiting, or other
|
|
deployment hardening. Add what your setup needs before putting it on the
|
|
public internet.
|
|
|
|
## Quick start
|
|
|
|
```bash
|
|
npm install
|
|
npm start # listens on :3000
|
|
```
|
|
|
|
Coming from the older JSON-file version of this server (a
|
|
`{ phones: [...], cmf: {...} }` file)?
|
|
|
|
```bash
|
|
npm run migrate -- path/to/deviceInfo.json
|
|
```
|
|
|
|
## Schema
|
|
|
|
- **phones** — one row per model: `deviceName`, `manufacturer`, `model` (unique),
|
|
`image` (default/fallback photo), `count` (total reports).
|
|
- **phone_codenames** — a phone can have more than one `Build.DEVICE` codename
|
|
(regional variants), so this is its own table rather than a column.
|
|
- **cmf_colors** — `(model, cmf_code) -> {name, folder, image}`. This is the
|
|
only source of truth for resolving a device's CMF color code to a real
|
|
color name — there's no public API for it. See `docs/CMF_COLOR.md`.
|
|
- **phone_color_reports** — how many reports came in per `(model, cmf_code)`,
|
|
so two units of the same model can be told apart by actual color.
|
|
- **device_names_update** — one row: `{version, db_path}`, served at
|
|
`/api/device-info/updates` for the library's `DeviceDatabase.checkForUpdates()`.
|
|
Point `db_path` at a sqlite file built by the library's own `gen-db.py`.
|
|
|
|
## API
|
|
|
|
| Route | Method | Notes |
|
|
|---|---|---|
|
|
| `/api/device-info/search-device/v1?search_exp=` | GET | **Deprecated**, kept for older clients. Substring match on `deviceName`, looser than v2. Built on the same `resolveImage()` helper as v2 so the two can't drift apart — just use v2 in new code. |
|
|
| `/api/device-info/search-device/v2?codename=&model=&manufacturer=&cmfColor=` | GET | Exact match; `cmfColor` optional, resolves the unit-specific image when known. |
|
|
| `/api/device-info/report-device-info` | POST | Body: `{deviceName, manufacturer, model, codename, image?, cmfColor?}`. |
|
|
| `/api/device-info/updates` | GET | `{version, url}` for the library's self-update check. |
|
|
| `/api/device-info/updates/db` | GET | Serves the raw device-names sqlite file. |
|
|
|
|
v1 doesn't fall back to an external lookup (e.g. Wikipedia) on a miss, it just
|
|
returns `{}`. Add that yourself in `routes/deviceInfo.js` if you want it.
|
|
|
|
## Images
|
|
|
|
`server.js` serves `public/images/<path>` statically. Point your `image`/`cmf.image`
|
|
columns at whatever layout you use there — nothing here requires a specific
|
|
one, but ours is `phonedb/<brand>/<model>/<color>/<view>.png`, with a `jpg/`
|
|
subfolder under each color holding the pre-cutout originals.
|