# Σύστημα Πόρων

Το σύστημα πόρων αποτελεί μία από τις πιο σημαντικές αρχιτεκτονικές έννοιες στο Chamilo 2.0. Παρέχει μια ενιαία αφαίρεση για όλο το περιεχόμενο του μαθήματος — έγγραφα, ασκήσεις, μονοπάτια μάθησης, δημοσιεύσεις φόρουμ και άλλα.

## Βασική Έννοια

Κάθε κομμάτι περιεχομένου μαθήματος αναπαριστάται από έναν **ResourceNode**. Αυτό παρέχει σε όλους τους τύπους περιεχομένου ένα κοινό σύνολο δυνατοτήτων:

* **Έλεγχος ορατότητας** — Εμφάνιση/απόκρυψη από τους μαθητές
* **Έλεγχος πρόσβασης** — Οι ψηφοφόροι ασφαλείας ελέγχουν τα δικαιώματα μέσω του ResourceNode
* **Αποθήκευση αρχείων** — Τα συνημμένα αρχεία αποθηκεύονται μέσω του ResourceFile
* **Δομή δέντρου** — Οι ResourceNodes σχηματίζουν ένα δέντρο (σχέσεις γονέα-παιδιού)
* **Καταγραφή ελέγχου** — Δημιουργός, ημερομηνία δημιουργίας, παρακολούθηση τροποποιήσεων

## Κύριες Οντότητες

### ResourceNode (`src/CoreBundle/Entity/ResourceNode.php`)

Η κεντρική οντότητα. Κάθε οντότητα περιεχομένου έχει σχέση ένα-προς-ένα με έναν ResourceNode.

Κύρια πεδία:

| Field           | Type         | Description                              |
| --------------- | ------------ | ---------------------------------------- |
| `id`            | integer      | Κύριο κλειδί                             |
| `uuid`          | UUID v4      | Μοναδικός αναγνωριστικός για χρήση API   |
| `title`         | string       | Τίτλος εμφάνισης                         |
| `creator`       | User         | Ο χρήστης που δημιούργησε αυτόν τον πόρο |
| `resourceFile`  | ResourceFile | Το συνημμένο αρχείο (αν υπάρχει)         |
| `resourceType`  | ResourceType | Ο τύπος του πόρου (έγγραφο, κουίζ κ.λπ.) |
| `parent`        | ResourceNode | Γονέας στο δέντρο πόρων                  |
| `children`      | Collection   | Παιδικοί ResourceNodes                   |
| `resourceLinks` | Collection   | Σύνδεσμοι ορατότητας και πρόσβασης       |

Το δέντρο χρησιμοποιεί τη στρατηγική **materialized path** του Gedmo για αποδοτικές ιεραρχικές ερωτήσεις.

### ResourceFile (`src/CoreBundle/Entity/ResourceFile.php`)

Αποθηκεύει τα πραγματικά δεδομένα αρχείου για έναν πόρο:

| Field          | Type    | Description                      |
| -------------- | ------- | -------------------------------- |
| `id`           | integer | Κύριο κλειδί                     |
| `title`        | string  | Αρχικό όνομα αρχείου             |
| `mimeType`     | string  | Τύπος MIME                       |
| `originalName` | string  | Αρχικό όνομα μεταφόρτωσης        |
| `size`         | integer | Μέγεθος αρχείου σε bytes         |
| `crop`         | string  | Δεδομένα περικοπής (για εικόνες) |

Η αποθήκευση αρχείων γίνεται από το Flysystem, έτσι τα αρχεία μπορούν να βρίσκονται σε τοπικό δίσκο, S3, Azure ή GCS ανάλογα με τη διαμόρφωση.

### ResourceLink

Ελέγχει την ορατότητα και την πρόσβαση ανά πλαίσιο. Υπάρχουν 3 κύριοι τύποι πλαισίου:

1. Course
2. Session
3. Group (σε ένα μάθημα)

Άρα η οντότητα ResourceLink αντανακλά τον συνδυασμό αυτών των 3 τύπων πλαισίου και καθιερώνει μια ορατότητα για αυτό το πλήρες πλαίσιο:

| Field        | Type    | Description                                 |
| ------------ | ------- | ------------------------------------------- |
| `course`     | Course  | Σε ποιο μάθημα ανήκει ο πόρος               |
| `session`    | Session | Σε ποια συνεδρία (null για βασικό μάθημα)   |
| `group`      | CGroup  | Σε ποια ομάδα (null για ολόκληρο το μάθημα) |
| `visibility` | integer | Ορατό, αόρατο ή διαγραμμένο                 |

Αυτό επιτρέπει στον ίδιο ResourceNode να έχει διαφορετική ορατότητα σε διαφορετικά πλαίσια (π.χ. ορατό σε μία συνεδρία αλλά κρυφό σε άλλη).

Αυτό ρυθμίζεται αυτόματα κατά τη χρήση της διεπαφής και την απόφαση, για παράδειγμα, ότι ένας πόρος είναι πόρος ειδικός για συνεδρία ο οποίος θα είναι ορατός για όλες τις ομάδες σε ένα δεδομένο μάθημα σε μια δεδομένη συνεδρία, αλλά αόρατος στο βασικό μάθημα ή σε άλλη συνεδρία.

Προεπιλογή, οι πόροι ορατοί σε ένα βασικό μάθημα είναι επίσης ορατοί σε όλες τις συνεδρίες αυτού του μαθήματος, αλλά ο επιβλέπων του μαθήματος μπορεί να αποφασίσει να κρύψει έναν πόρο από συγκεκριμένη συνεδρία. Σε αυτή την περίπτωση, θα ανακτήσουμε την ειδική ορατότητα αυτού του πόρου σε αυτή τη συνεδρία και θα δούμε ότι έχει ορατότητα 0, οπότε το στοιχείο δεν θα εμφανίζεται στους μαθητές σε αυτή τη συνεδρία, ενώ η έλλειψη ορατότητας ειδικής για συνεδρία σε άλλες συνεδρίες θα κάνει τον πόρο να χρησιμοποιήσει την ορατότητα του βασικού μαθήματος (και ο πόρος θα εμφανίζεται στους μαθητές).

## Ενσωμάτωση API Platform

Ο ResourceNode εκτίθεται ως πόρος API Platform με ασφάλεια:

```php
#[ApiResource(
    operations: [
        new Get(security: "is_granted('VIEW', object)"),
        new Put(security: "is_granted('EDIT', object)"),
        new Delete(security: "is_granted('DELETE', object)"),
        new GetCollection(security: "is_granted('ROLE_USER')"),
    ]
)]
```

## Πώς Συνδέονται οι Οντότητες Περιεχομένου

Οι οντότητες περιεχομένου μαθήματος (CDocument, CQuiz, CLp κ.λπ.) επεκτείνουν το `AbstractResource` ή υλοποιούν το `ResourceInterface`, το οποίο τους δίνει μια σχέση `resourceNode`:

```php
// In CDocument entity:
#[ORM\OneToOne(targetEntity: ResourceNode::class)]
private ResourceNode $resourceNode;
```

Όταν δημιουργείτε ένα CDocument, δημιουργείται αυτόματα ένας ResourceNode μαζί του, παρέχοντας ενιαία διαχείριση πόρων.

## Πρακτικές Συνέπειες

Κατά την εργασία με περιεχόμενο μαθήματος:

1. **Δημιουργία περιεχομένου** — Δημιουργήστε τόσο την οντότητα περιεχομένου όσο και τον ResourceNode της
2. **Έλεγχος δικαιωμάτων** — Χρησιμοποιήστε τους ψηφοφόρους ασφαλείας του ResourceNode
3. **Διαχείριση αρχείων** — Συνδέστε αρχεία μέσω του ResourceFile
4. **Έλεγχος ορατότητας** — Δημιουργήστε/τροποποιήστε ResourceLinks
5. **Δόμηση δέντρων** — Χρησιμοποιήστε τη σχέση γονέα-παιδιού στον ResourceNode για δομές φακέλων (π.χ. φάκελοι εγγράφων)


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.chamilo.org/2.x-el/odigos-programmatisti/developer-guide/backend/resource-system.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
