On 25.02.2009, at 06:16, Chris Anderson wrote:
[snip]
Currently, there is no way for an html attachment to a design document
to link to other resources provided by that design document, absent
client side scripting, or hardcoding the design document name in the
html (neither of which are acceptable).

If you are the HTML hosted at /db/_design/foo/index.html and you want
to provide browsers a link to /db/_view/foo/bar?limit=10 you can't.
You can link to other attachments in the same design document, very
easily.

One way to fix this it to give the resources made available by a
design document a common root. This means we can use hrefs like
"_show/docid" to link to a show function from an attachment.  So we
get paths like this:

/db/_design/foo/_view/bar?limit=10
/db/_design/foo/_show/docid
/db/_design/foo/index.html

The downside is that the URLs are longer (and that the change would
break all clients), the upside is the ability to link from one to the
other (and thus be part of the web).

I'm in favor of this change. It would be nice if couchapp-style applications were able to use relative URLs, and don't have to care about the name of the design doc they've been placed in. Sure breaks backwards compatibility badly, but I think it's worth it in this case.

== A related question ==

I checked a patch into Futon the other day (with a note here on dev@)
that links to any apps that are in any of your databases. This is not
meant as an end-user API. It is a step toward an end-user API. The key
similarity is the process for discovering apps. In my mind, an app is
a design document that provides a user interface.

Here's the screenshot of that feature that I linked from my earlier
dev post: http://img.skitch.com/20090225- ttb3gmd86unthjw9i6cqhjs9c9.png

Each app has a start page. Currently, an app's start page is defined
in the design_doc.couchapp.index field. (The details of that field are
subject to change based on the previous section of this mail.) If the
couchapp.index field does not exist, but the design doc has an
index.html attachment, then that is used as its start page. If a
design doc has neither the field nor an index.html attachment, it is
not considered to be an app, and is not linked to from Futon.

The question raised by all of this is how closely do we want CouchDB
to be intertwined with CouchApp?

I think that, at least for the time being, it's best if CouchApp remained a separate project, in the sense that nothing in CouchDB should know about the CouchApp side. I certainly agree that CouchApp- style applications are pretty exciting (albeit in a very alpha-geekish way), but I also think there will continue to be a large percentage of CouchDB users (myself included) who use CouchDB in a more traditional way, as a storage backend sitting behind a regular web-based application, with a web server sitting between the user and the database. In my opinion we should go out of our way to avoid the impression that CouchApps are the preferred/endorsed way to use CouchDB.

In that vein, I'm not in favor of the CouchApp links on the Futon start page. I've generally tried to keep Futon extremely neutral to the specific ways people may use CouchDB, and the CouchApp links smell too much like an official endorsement of one particular method to me. Plus, the "Applications" column must be rather confusing for any CouchDB users who haven't played with the CouchApp concept yet ("Hum, how do I get my PHP scripts in there?" [not that anyone should be writing PHP scripts in the first place]).

Ideally, we'd have some way in Futon for extensions to register their own pages that show up in the sidebar navigation (that might be as simple as a config section, if we didn't have that pesky admin auth prompt for reading config values ;) ). If we had that, I think there should be a CouchApp plugin that registered an "Applications" page that could do some discovery on demand. Actually, I'd go even further, and suggest that the "show" and "list" features should be part of that CouchApp plugin, and not actually included with CouchDB itself. You really only need those features when you're developing CouchApp-style applications. Moving them into a corresponding plugin would help keep CouchDB itself lean and clean.

Moving those into a plugin should be almost trivial on the Erlang level AFAICT. The problem is the Javascript "query server", which by now is full of stuff I personally don't useā€¦ some of them just for tests, some for "external", some for "show"/"list". I think we'll need to figure out a good way to split up good ole main.js (and maybe even couchjs) so that CouchDB only includes the commonly used parts, but extensions can add whatever they may need. The current approach of one "query_server" (which has long been misnomer) per language implementing all the hooks is going to break down pretty fast. Maybe, we should have [view_servers], [validation_servers], [render_servers], and so on, instead. Only with proper names.

And for the record, I still think "show" and "list" are not good names for what they do :) But then again, if they'd get moved out into an external CouchApp plugin, I wouldn't have to care (as long as I don't become a CouchApp aficionado, that is).

Cheers,
--
Christopher Lenz
  cmlenz at gmx.de
  http://www.cmlenz.net/

Reply via email to