# FirestoreObject

O **FirestoreObject** representa um objeto que tem como origem a base de dados.

### Sintaxe

```javascript
import { FirestoreObject } from "Models";

class ChildClass extends FirestoreObject { 
    constructor(path){
        super(path);
        criarAtributoReferencial("path");
        ...
    }
    ... 
}
```

## Propriedades

### path

path: string | null

Uma propriedade que define o caminho de acesso no firestore para o objeto.

Exemplo:

```javascript
import { FirestoreObject } from "Models";

class Usuario extends FirestoreObject{
    constructor(path){
        super(path);
    }
}

let usuario = new Usuario("Usuarios/xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx");

console.log(usuario.path);
// Usuarios/xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
```

## **Métodos**

### addInvisibleProperty

addInvisibleProperty ( key : string ) : any

Um método que recebe como parâmetro *key : string* que defina a chave da propriedade do objeto que será invisível.

Exemplo:

```javascript
import { FirestoreObject } from "Models";

class Usuario extends FirestoreObject{
    constructor(path, nome){
        super(path);
        this.nome = nome || "";
        this.addInvisibleProperty("nome");
    }
}
```

### **corrigirReferencia**

corrigirReferencia ( value : string ) : string

Uma função que corrige o parâmetro *value : string* de referência formatando o caminha de acesso no firestore.

Exemplo:

```javascript
import { FirestoreObject } from "Models";

class Usuario extends FirestoreObject{
    constructor(path, nome){
        super(path);
    }
}

let usuario = new Usuario("/Usuarios/xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx/");
let path = usuario.corrigirReferencia(usuario.path);

console.log(path);
// Usuarios/xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
```

### criarAtributoReferencial

criarAtributoReferencial ( nome : string , enumeravel ? : boolean ) : any

Um método que indique uma propriedade de referência recebendo seu **nome** de propriedade como parâmetro. Como por exemplo, a propriedade *path*, quando essa propriedade ser alterada, acionará automaticamente a função *corrigirReferencia* para que o *path* informado, seja corrigido para o formado correto.

```javascript
import { FirestoreObject } from "Models";

class Usuario extends FirestoreObject{
    constructor(path, nome){
        super(path);
        criarAtributoReferencial("path");
    }
}

let usuario = new Usuario();
usuario.path = "/Usuarios/xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx/";

console.log(usuario.path);
// Usuarios/xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx
```

### toJson

toJson( target ? : Object ) : Object

Método que converte o *objeto* atual ou passado como parâmetro em um formato [JSON](https://www.json.org/json-pt.html).

```javascript
import { FirestoreObject } from "Models";

class Usuario extends FirestoreObject{
    constructor(path, nome){
        super(path);
        criarAtributoReferencial("path");
        this.nome = nome || "";
    }
}

let usuario = new Usuario("/Usuarios/xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx/", "Fulano");

console.log(usuario.toJson());

//Ou

console.log(Usuario.toJson(usuario));

/* object Usuario {
    "path": "Usuarios/xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx",
    "nome": "Fulano"
} */
```

### parse

parse ( path :  string | null , objetoGenerico : Object ) : Object

Esse método é útil para quando pretende importar informações em um objeto no formato JSON para o objeto estrutural. Lembrando que o parâmetro *path* se refere ao caminho de acesso no firestore para o objeto e o parâmetro *objetoGenerico* se refere ao objeto genérico [JSON](https://www.json.org/json-pt.html).

```javascript
import { FirestoreObject } from "Models";

class Usuario extends FirestoreObject{
    constructor(path, nome){
        super(path);
        criarAtributoReferencial("path");
        this.nome = nome || "";
    }
}

let objetoGenerico = {
    "path": "Usuarios/xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx",
    "nome": "Fulano"
};

let usuario = new Usuario().parse(objetoGenerico.path, objetoGenerico);

console.log(usuario.toJson());

/* object Usuario {
    "path": "Usuarios/xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx",
    "nome": "Fulano"
} */
```
