italia / italia/publiccode-editor

Export publiccode.yml directly to a code repository

Ouverte
#653 0 commentaires 0 réactions 0 personnes assignées Voir sur GitHub
enhancement
Langage dominant
TypeScript
Étoiles
32
Forks
33
Merge moyen
3 j 15 h
PR mergées (30 j)
16

Description

## Context

Derived from requirement **RF-PCE-003**

## Scope

Today the only ways out of the editor are "copy to clipboard" and "download
publiccode.yml", both in `YamlPreview`. From there the user has to find their
repository, create or open the file, and paste. Close that gap: let the editor hand the
generated YAML straight to the code hosting platform.

The mechanism is deliberately link-based — the platform's own *edit file* page, prefilled
with the generated content — not an authenticated API call:

- GitHub: `///new/?filename=publiccode.yml&value=` for a
new file, `/edit//publiccode.yml` for an existing one.
- GitLab: the equivalent `/-/new/` and `/-/edit//` routes.

The user stays in their own authenticated session on the platform, reviews the diff
there, and commits. Nothing is written on their behalf.

This choice is what keeps the requirement compatible with the app's architecture: the
editor is a static SPA with no back-end, so it has nowhere to keep an OAuth secret or a
token. A link-based export keeps it that way.

The import side already knows how to turn a platform web URL into something actionable
(`gitlab-url-adapter.ts` parses a GitLab web URL into an API URL). This is the same
translation in reverse, and the two should end up sharing their understanding of what a
repository URL looks like.

## Affected areas

- `src/app/components/YamlPreview.tsx` — the toolbar that currently holds copy /
upload / download; the new action belongs alongside them.
- New `src/app/exporters/` module, mirroring the existing `src/app/importers/`
structure (`file.importer.ts`, `gitlab.importer.ts`, `standard.importer.ts`), with one
exporter per supported platform.
- `src/app/importers/gitlab-url-adapter.ts` — the URL parsing to build on; consider
extracting the shared part rather than duplicating it.
- `src/app/is-valid-url.ts` — existing URL validation helper, to reuse instead of adding
a second one.
- `src/i18n/locales/*.json` — strings for the new action.

## Non-functional constraints

- **RNF-PCE-001 — Security (OWASP Top 10)**: the destination URL comes from the user, so
this is an open-redirect surface. Validate scheme and host against the supported
platforms before navigating, and never interpolate unescaped content into the URL.
Note also that prefilling via query string has a practical length limit, so the
behaviour when a `publiccode.yml` exceeds it must be defined rather than silently
truncating.
- **RNF-PCE-004 — Standards and compliance**: the editor must not acquire a dependency
on a third-party service without an open source implementation. Supporting GitLab
(self-hostable) alongside GitHub keeps a fully open source path available, and matters
for public administrations running their own instance.

## Acceptance criteria

- [ ] From the preview panel the user can send the generated YAML to a repository's file
edit page, prefilled, on at least GitHub and GitLab
- [ ] Self-hosted GitLab instances work, not only gitlab.com
- [ ] Both cases are handled: the file does not exist yet, and it already does
- [ ] The destination URL is validated before navigation; unsupported or malformed hosts
are refused with a clear message
- [ ] Defined, non-silent behaviour when the content is too large to prefill by URL
- [ ] No credentials, tokens or back-end involved; the app remains a static SPA
- [ ] URL-building logic covered by unit tests, in the style of
`gitlab-url-adapter.spec.ts`
- [ ] New strings translated in every supported locale

## Related

- #647 — new locales; the strings added here need to land there too

Guide de contribution

Ouvrir le guide de contribution

Piste de recherche

Start in src/app/components/YamlPreview.tsx, then compare the new src/app/exporters/ module with src/app/importers/ and read gitlab-url-adapter.ts and is-valid-url.ts. Use gitlab-url-adapter.spec.ts as the testing model. Done means validated GitHub and GitLab links support new and existing files, self-hosted GitLab, oversized content behavior, translations, and unit coverage without credentials or a backend.

Rédigé par le modèle d'indexation à partir du texte de l'issue.

Évaluation

Stack technique
github, gitlab, typescript
Domaine
frontend, internationalization, security, testing
Type d'issue
Fonctionnalité
Difficulté
4/5
Temps estimé
3-5 jours
Activité
Active
Clarté
Plutôt claire
Accessibilité débutants
52/100

Recevez les nouvelles issues par e-mail

Un résumé court des issues GitHub adaptées aux débutants.