Restaurant profile
Public name, address, and contact for a restaurant's single location.
Restaurant profile
A restaurant has one location. The public profile is a separate row from branding and from the order pause. restaurants keeps the name, slug, status, logo URL, colors, and orders_paused. Address and contact live in restaurant_profiles.
A missing profile row is public as profile: null. Checkout does not read the profile. Delivery zones do not match against it.
Table
restaurant_profiles
| Column | Notes |
|---|---|
restaurant_id | Primary key and FK → restaurants.id (ON DELETE restrict) |
description | Short public text, 1–280 characters |
street, house_number, postal_code, city | Display address. Postal code is five digits |
country_code | DE |
phone, email | Public contact. Email is stored lowercased |
latitude, longitude | Both null, or both set |
map_url | Optional http or https link, or null |
created_at / updated_at | Timestamps |
API
GET /storefront/restaurant includes profile for the hostname tenant. A restaurantId query does not change the tenant.
| Method | Path | Notes |
|---|---|---|
GET | /dashboard/restaurants/:restaurantId/profile | { restaurantId, profile }. profile is null when the row is missing |
PUT | /dashboard/restaurants/:restaurantId/profile | Creates or replaces the row. Staff session required |
PUT body: description, street, house number, postal code, city, countryCode: "DE", phone, email, latitude, longitude, mapUrl. An unknown restaurant is 404. A bad postal code, a single coordinate, or a non-http map link is 400, and the stored row stays as it was. A restaurantId in the body does not switch the tenant.
The dashboard editor is on /.
Seeds
Luigi is Bergmannstraße 12, 10961 Berlin, with a pin and a map link. Mario is Prenzlauer Allee 42, 10405 Berlin, without a pin or a map link. Seeds still create no orders.