Skip to content

Commit

Permalink
Merge pull request #257 from markalbrand56/ale_last_sprint
Browse files Browse the repository at this point in the history
Documentación y Revisión Final
  • Loading branch information
jazurdia authored Nov 17, 2023
2 parents 87b1db7 + 9387f93 commit 1ad6b9a
Show file tree
Hide file tree
Showing 5 changed files with 119 additions and 64 deletions.
38 changes: 11 additions & 27 deletions backend/README.md
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ Empresa
}
}
```
-----------------
### [POST] api/users/details
Obtener los detalles públicos de un usuario, dado su correo
> **Note**
Expand Down Expand Up @@ -121,7 +122,8 @@ Obtener los detalles públicos de un usuario, dado su correo
}
}
```
---

-----------------
## Estudiante
### [POST] api/students
Crea un estudiante
Expand Down Expand Up @@ -184,7 +186,8 @@ Actualiza un estudiante
"data": null
}
```
---
-----------------

## Mensajes
### [POST] api/messages/send
Crea un mensaje
Expand Down Expand Up @@ -301,7 +304,8 @@ Devuelve los mensajes de un chat dado el emisor y el receptor
}
}
```
---
-----------------

## Empresas
### [POST] api/companies
Crea una compañia
Expand Down Expand Up @@ -642,7 +646,8 @@ Retorna los estudiantes que se han postulado a una oferta
}
```

---
-----------------

## Carreras
### [GET] api/careers
Devuelve todas las carreras
Expand Down Expand Up @@ -678,27 +683,7 @@ Devuelve todas las carreras
}
}
```

### [POST] api/careers
Crea una carrera

## Params
``` json
{
"nombre" : string
"descripcion" : string
}
```

#### Response
``` json
{
"status": 200,
"message": "Career created successfully",
"data": nil
}
```
---
-----
## Postulaciones
### [POST] api/postulation
Crea una postulacíón de trabajo, cuando un estudiante se postula a una oferta
Expand Down Expand Up @@ -749,7 +734,6 @@ Devuelve las postulaciones de un Estudiante.
]
}
}

```

### [DELETE] api/postulations/?id_postulacion=1
Expand All @@ -766,7 +750,7 @@ Elimina una postulación. El usuario se obtiene del token. Se pasa el id de la p
}
```

---
-----------------
## Administradores
### [GET] api/admins/students
Retorna información de estudiantes para el panel de administradores
Expand Down
56 changes: 33 additions & 23 deletions backend/controllers/files.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,12 +15,13 @@ import (
"strings"
)

// Updates the profile picture of the user
func UpdateProfilePicture() gin.HandlerFunc {
return func(c *gin.Context) {
user, err := utils.TokenExtractUsername(c)
user, err := utils.TokenExtractUsername(c) // get the username from the token
acceptedFileTypes := []string{"png", "jpg", "jpeg"}

if err != nil {
if err != nil { // if the token is invalid
c.JSON(http.StatusUnauthorized, responses.StandardResponse{
Status: http.StatusUnauthorized,
Message: "Unauthorized. Cannot get information from token. " + err.Error(),
Expand All @@ -34,12 +35,12 @@ func UpdateProfilePicture() gin.HandlerFunc {
fmt.Println("Username upload: " + user_stripped)

// single file
fileHeader, _ := c.FormFile("file")
fileHeader, _ := c.FormFile("file") // get the file from the request

// get the file type from filename
fileType := fileHeader.Filename[strings.LastIndex(fileHeader.Filename, ".")+1:]

if !utils.Contains(acceptedFileTypes, fileType) {
if !utils.Contains(acceptedFileTypes, fileType) { // if the file type is not accepted
c.JSON(http.StatusBadRequest, responses.StandardResponse{
Status: http.StatusBadRequest,
Message: "Invalid file type. Accepted file types are " + strings.Join(acceptedFileTypes, ", "),
Expand All @@ -48,12 +49,12 @@ func UpdateProfilePicture() gin.HandlerFunc {
return
}

// generate a random image.
randomNumber := rand.Intn(9999999999-1111111111) + 1111111111
newFileName := user_stripped + "_" + fmt.Sprint(randomNumber) + "." + fileType

fileHeader.Filename = newFileName

dst := "./uploads/" + newFileName
dst := "./uploads/" + newFileName // destination

// Eliminar archivos antiguos con el mismo prefijo de usuario
if err := deleteFilesWithPrefix("./uploads/", user_stripped); err != nil {
Expand All @@ -77,6 +78,7 @@ func UpdateProfilePicture() gin.HandlerFunc {
return
}

// Update the profile picture in the database
if userType == "student" {
err = configs.DB.Model(&models.Estudiante{}).Where("correo = ?", user).Updates(models.Estudiante{Foto: newFileName}).Error
} else if userType == "enterprise" {
Expand Down Expand Up @@ -118,6 +120,7 @@ func UpdateProfilePicture() gin.HandlerFunc {
return
}

// return the filename to the client
c.JSON(http.StatusOK, responses.StandardResponse{
Status: http.StatusOK,
Message: "File uploaded successfully",
Expand All @@ -128,12 +131,13 @@ func UpdateProfilePicture() gin.HandlerFunc {
}
}

// Updates the CV of the user
func UpdateCV() gin.HandlerFunc {
return func(c *gin.Context) {
user, err := utils.TokenExtractUsername(c)
acceptedFileTypes := []string{"pdf"}

if err != nil {
if err != nil { // if the token is invalid
c.JSON(http.StatusUnauthorized, responses.StandardResponse{
Status: http.StatusUnauthorized,
Message: "Unauthorized. Cannot get information from token. " + err.Error(),
Expand All @@ -144,7 +148,7 @@ func UpdateCV() gin.HandlerFunc {

// strip username from email. ignoring everything after @
user_stripped := user[:strings.Index(user, "@")]
fmt.Println("Username upload: " + user_stripped)
fmt.Println("Username upload: " + user_stripped) // single file (print-debbuging)

// single file
file, _ := c.FormFile("file")
Expand All @@ -161,6 +165,7 @@ func UpdateCV() gin.HandlerFunc {
return
}

// generate a random image.
randomNumber := rand.Intn(9999999999-1111111111) + 1111111111
newFileName := user_stripped + "_" + fmt.Sprint(randomNumber) + "." + fileType

Expand Down Expand Up @@ -191,6 +196,7 @@ func UpdateCV() gin.HandlerFunc {
return
}

// Update the profile picture in the database
if userType != "student" {
c.JSON(http.StatusUnauthorized, responses.StandardResponse{
Status: http.StatusUnauthorized,
Expand All @@ -200,6 +206,7 @@ func UpdateCV() gin.HandlerFunc {
return
}

// Update the profile picture in the database
err = configs.DB.Model(&models.Estudiante{}).Where("correo = ?", user).Updates(models.Estudiante{CV: newFileName}).Error

// Save locally
Expand Down Expand Up @@ -236,6 +243,7 @@ func UpdateCV() gin.HandlerFunc {
return
}

// return the filename to the client
c.JSON(http.StatusOK, responses.StandardResponse{
Status: http.StatusOK,
Message: "File uploaded successfully",
Expand All @@ -246,26 +254,26 @@ func UpdateCV() gin.HandlerFunc {
}
}

// Deletes the profile picture of the user
func deleteFilesWithPrefix(directory, prefix string) error {
files, err := os.ReadDir(directory)
files, err := os.ReadDir(directory) // read the directory
if err != nil {
return err
}
} // iterate over the files

for _, file := range files {
//fmt.Println(file.Name())
if strings.HasPrefix(file.Name(), prefix) {
if strings.HasPrefix(file.Name(), prefix) { // if the file starts with the prefix
filePath := filepath.Join(directory, file.Name())
fmt.Println("Deleting file: " + filePath)
fmt.Println("Deleting file: " + filePath) // delete the file
if err := os.Remove(filePath); err != nil {
return err
}
}
}

return nil
}

// Returns the profile picture of the user
func GetProfilePicture() gin.HandlerFunc {
return func(c *gin.Context) {
filename := c.Param("filename")
Expand All @@ -282,9 +290,9 @@ func GetProfilePicture() gin.HandlerFunc {
return
}

defer func(Body io.ReadCloser) {
defer func(Body io.ReadCloser) { // Cerrar el cuerpo de la respuesta del servidor de archivos externo
err := Body.Close()
if err != nil {
if err != nil { // Si hay un error al cerrar el cuerpo de la respuesta del servidor de archivos externo
c.JSON(http.StatusInternalServerError, responses.StandardResponse{
Status: http.StatusInternalServerError,
Message: "Error al cerrar el cuerpo de la respuesta del servidor de archivos externo: " + err.Error(),
Expand All @@ -294,7 +302,7 @@ func GetProfilePicture() gin.HandlerFunc {
}
}(resp.Body)

if resp.StatusCode != http.StatusOK {
if resp.StatusCode != http.StatusOK { // Si el código de estado de la respuesta del servidor de archivos externo no es 200
c.JSON(http.StatusNotFound, responses.StandardResponse{
Status: http.StatusNotFound,
Message: "Archivo no encontrado en el servidor de archivos externo",
Expand All @@ -321,14 +329,15 @@ func GetProfilePicture() gin.HandlerFunc {
}
}

// Returns the CV of the user
func GetCV() gin.HandlerFunc {
return func(c *gin.Context) {
filename := c.Param("filename")
fileURL := configs.FileServer + "pdf/" + filename
filename := c.Param("filename") // Obtener el nombre del archivo de la URL
fileURL := configs.FileServer + "pdf/" + filename // Construir la URL del servidor de archivos externo

// Realizar una solicitud GET al servidor de archivos externo
resp, err := http.Get(fileURL)
if err != nil {
if err != nil { // Si hay un error al realizar la solicitud GET, devolver un error al cliente
c.JSON(http.StatusNotFound, responses.StandardResponse{
Status: http.StatusNotFound,
Message: "Error al obtener el archivo: " + err.Error(),
Expand All @@ -337,19 +346,20 @@ func GetCV() gin.HandlerFunc {
return
}

// Cerrar el cuerpo de la respuesta del servidor de archivos externo
defer func(Body io.ReadCloser) {
err := Body.Close()
if err != nil {
if err != nil { // Si hay un error al cerrar el cuerpo de la respuesta del servidor de archivos externo
c.JSON(http.StatusInternalServerError, responses.StandardResponse{
Status: http.StatusInternalServerError,
Message: "Error al cerrar el cuerpo de la respuesta del servidor de archivos externo: " + err.Error(),
Data: nil,
})
return
}
}(resp.Body)
}(resp.Body) // Cerrar el cuerpo de la respuesta del servidor de archivos externo

if resp.StatusCode != http.StatusOK {
if resp.StatusCode != http.StatusOK { // Si el código de estado de la respuesta del servidor de archivos externo no es 200
c.JSON(http.StatusNotFound, responses.StandardResponse{
Status: http.StatusNotFound,
Message: "Archivo no encontrado en el servidor de archivos externo",
Expand Down
Loading

0 comments on commit 1ad6b9a

Please sign in to comment.