<markdown> # Attachments and Links ## Terminology - Attachment : Anything that can be attached to a note - Link : Anything remote linked to in a note - AttachmentThumbnail : The thumbnail of an attachment

Not every Link has an attachment. An attachment is created for a link when it becomes something attachable. So happens when additional information on a link's URL becomes available.

Following how it is done with Links, anything with a thumbnail in GNU social must have an attachment as only attachments can have a thumbnail.

This design prevents file and thumbnail duplication, thus saving storage.

An example of a module making use of this system is the Avatar component. It creates an attachment and uses the thumbnail route to access different avatar sizes via the `AttachmentThumbnail` controller.

# Migrating data from v2

## File to Attachment

Direct transformation: * `id` ⇒ `id` * `filehash` ⇒ `filehash` * `mimetype` ⇒ `mimetype` * `size` ⇒ `size` * `modified` ⇒ `modified`

Requires computation: * `filename` ⇒ {if file is in storage then `filename`, else null} * `width` ⇒ {if file is known by V3, re-compute then `width`, else null} * `height` ⇒ {if file is known by V3, re-compute then `height`, else null} * Count references and fill `lives`

## File to Link

Only if `url` and `urlhash` are not null.

Direct transformation: * `id` ⇒ `id` * `url` ⇒ `url` * `urlhash` ⇒ `url_hash`

## File and File_to_post to AttachmentToNote

Direct transformation by joining File f and File_to_post fp on `id` = `file_id` with fp.file_id, fp.post_id, f.title, f.filename, fp.modified: * `file_id` ⇒ `attachment_id` * `post_id` ⇒ `note_id` * `modified` ⇒ `modified`

Requires computation: * `title` ?? `filename` ⇒ `title`

## File_thumbnail to AttachmentThumbnail

For every attachment where we have the original (filename not null), just let them be regenerated on request. For all the others, compute the mime-type and rescale to the new default sizes.

The field `url` from File_thumbnail has duplicated information that was already migrated in the tables above and can, therefore, be safely ignored now.

# Embed and StoreRemoteMedia TODO </markdown>