Skip to content
Toggle navigation
P
Projects
G
Groups
S
Snippets
Help
Alba María Álvarez
/
AppRecetas
This project
Loading...
Sign in
Toggle navigation
Go to a project
Project
Repository
Issues
0
Merge Requests
0
Pipelines
Wiki
Snippets
Settings
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Commit
b1bcf0a3
authored
Jun 17, 2025
by
Alba María Álvarez
Browse files
Options
_('Browse Files')
Download
Email Patches
Plain Diff
perf(user): cambio a base de datos MongoDB
parent
d999d328
Show whitespace changes
Inline
Side-by-side
Showing
24 changed files
with
69 additions
and
70 deletions
src/main/java/com/example/apprecetas/user/application/DeleteUserUseCase.java
src/main/java/com/example/apprecetas/user/application/ReadUserUseCase.java
src/main/java/com/example/apprecetas/user/application/UpdateUserUseCase.java
src/main/java/com/example/apprecetas/user/application/impl/CreateUserUseCaseImpl.java
src/main/java/com/example/apprecetas/user/application/impl/DeleteUserUseCaseImpl.java
src/main/java/com/example/apprecetas/user/application/impl/ReadUserUseCaseImpl.java
src/main/java/com/example/apprecetas/user/application/impl/UpdateUserUseCaseImpl.java
src/main/java/com/example/apprecetas/user/domain/entity/User.java
src/main/java/com/example/apprecetas/user/domain/repository/CreateUserRepository.java
src/main/java/com/example/apprecetas/user/domain/repository/DeleteUserRepository.java
src/main/java/com/example/apprecetas/user/domain/repository/ReadUserRepository.java
src/main/java/com/example/apprecetas/user/domain/repository/UpdateUserRepository.java
src/main/java/com/example/apprecetas/user/infrastructure/controller/DeleteUserController.java
src/main/java/com/example/apprecetas/user/infrastructure/controller/ReadUserController.java
src/main/java/com/example/apprecetas/user/infrastructure/controller/UpdateUserController.java
src/main/java/com/example/apprecetas/user/infrastructure/controller/dto/UserOutputDto.java
src/main/java/com/example/apprecetas/user/infrastructure/mapper/UserMapper.java
src/main/java/com/example/apprecetas/user/infrastructure/repository/impl/CreateUserRepositoryImpl.java
src/main/java/com/example/apprecetas/user/infrastructure/repository/impl/DeleteUserRepositoryImpl.java
src/main/java/com/example/apprecetas/user/infrastructure/repository/impl/ReadUserRepositoryImpl.java
src/main/java/com/example/apprecetas/user/infrastructure/repository/impl/UpdateUserRepositoryImpl.java
src/main/java/com/example/apprecetas/user/infrastructure/repository/jpa/UserRepositoryJpa.java
src/main/java/com/example/apprecetas/user/infrastructure/repository/jpa/UserJpa.java → src/main/java/com/example/apprecetas/user/infrastructure/repository/mongodb/UserDocument.java
src/main/java/com/example/apprecetas/user/infrastructure/repository/mongodb/UserRepository.java
src/main/java/com/example/apprecetas/user/application/DeleteUserUseCase.java
View file @
b1bcf0a3
...
...
@@ -2,6 +2,6 @@ package com.example.apprecetas.user.application;
public
interface
DeleteUserUseCase
{
void
deleteById
(
Lo
ng
id
);
void
deleteById
(
Stri
ng
id
);
}
src/main/java/com/example/apprecetas/user/application/ReadUserUseCase.java
View file @
b1bcf0a3
...
...
@@ -6,7 +6,7 @@ import java.util.List;
public
interface
ReadUserUseCase
{
User
readById
(
Lo
ng
id
);
User
readById
(
Stri
ng
id
);
List
<
User
>
readAll
();
...
...
src/main/java/com/example/apprecetas/user/application/UpdateUserUseCase.java
View file @
b1bcf0a3
...
...
@@ -4,6 +4,6 @@ import com.example.apprecetas.user.domain.entity.User;
public
interface
UpdateUserUseCase
{
User
updateById
(
Lo
ng
id
,
User
inputUser
);
User
updateById
(
Stri
ng
id
,
User
inputUser
);
}
src/main/java/com/example/apprecetas/user/application/impl/CreateUserUseCaseImpl.java
View file @
b1bcf0a3
...
...
@@ -4,7 +4,7 @@ import com.example.apprecetas.user.application.CreateUserUseCase;
import
com.example.apprecetas.user.domain.entity.User
;
import
com.example.apprecetas.user.domain.repository.CreateUserRepository
;
import
com.example.apprecetas.user.infrastructure.mapper.UserMapper
;
import
com.example.apprecetas.user.infrastructure.repository.
jpa.UserJpa
;
import
com.example.apprecetas.user.infrastructure.repository.
mongodb.UserDocument
;
import
lombok.RequiredArgsConstructor
;
import
org.mapstruct.factory.Mappers
;
import
org.springframework.security.crypto.password.PasswordEncoder
;
...
...
@@ -21,9 +21,9 @@ public class CreateUserUseCaseImpl implements CreateUserUseCase {
@Override
public
User
create
(
User
user
)
{
User
Jpa
userJpa
=
mapper
.
mapJpa
(
user
);
user
Jpa
.
setPassword
(
passwordEncoder
.
encode
(
userJpa
.
getPassword
()));
User
Jpa
createdUser
=
repository
.
create
(
userJpa
);
return
mapper
.
map
Jpa
(
createdUser
);
User
Document
userDocument
=
mapper
.
mapDocument
(
user
);
user
Document
.
setPassword
(
passwordEncoder
.
encode
(
userDocument
.
getPassword
()));
User
Document
createdUser
=
repository
.
create
(
userDocument
);
return
mapper
.
map
Document
(
createdUser
);
}
}
src/main/java/com/example/apprecetas/user/application/impl/DeleteUserUseCaseImpl.java
View file @
b1bcf0a3
...
...
@@ -16,7 +16,7 @@ public class DeleteUserUseCaseImpl implements DeleteUserUseCase {
private
final
ReadUserRepository
readUserRepository
;
@Override
public
void
deleteById
(
Lo
ng
id
)
{
public
void
deleteById
(
Stri
ng
id
)
{
readUserRepository
.
readById
(
id
)
.
orElseThrow
(()
->
new
EntityNotFoundException
(
"El usuario con id "
+
id
+
" no existe."
));
deleteUserRepository
.
deleteById
(
id
);
...
...
src/main/java/com/example/apprecetas/user/application/impl/ReadUserUseCaseImpl.java
View file @
b1bcf0a3
...
...
@@ -5,7 +5,7 @@ import com.example.apprecetas.user.application.ReadUserUseCase;
import
com.example.apprecetas.user.domain.entity.User
;
import
com.example.apprecetas.user.domain.repository.ReadUserRepository
;
import
com.example.apprecetas.user.infrastructure.mapper.UserMapper
;
import
com.example.apprecetas.user.infrastructure.repository.
jpa.UserJpa
;
import
com.example.apprecetas.user.infrastructure.repository.
mongodb.UserDocument
;
import
lombok.RequiredArgsConstructor
;
import
org.mapstruct.factory.Mappers
;
import
org.springframework.stereotype.Service
;
...
...
@@ -21,16 +21,16 @@ public class ReadUserUseCaseImpl implements ReadUserUseCase {
private
final
UserMapper
mapper
=
Mappers
.
getMapper
(
UserMapper
.
class
);
@Override
public
User
readById
(
Lo
ng
id
)
{
User
Jpa
userJpa
=
repository
.
readById
(
id
)
public
User
readById
(
Stri
ng
id
)
{
User
Document
userDocument
=
repository
.
readById
(
id
)
.
orElseThrow
(()
->
new
EntityNotFoundException
(
"Usuario con id "
+
id
+
" no encontrado"
));
return
mapper
.
map
Jpa
(
userJpa
);
return
mapper
.
map
Document
(
userDocument
);
}
@Override
public
List
<
User
>
readAll
()
{
return
repository
.
readAll
().
stream
()
.
map
(
mapper:
:
map
Jpa
)
.
map
(
mapper:
:
map
Document
)
.
toList
();
}
}
src/main/java/com/example/apprecetas/user/application/impl/UpdateUserUseCaseImpl.java
View file @
b1bcf0a3
...
...
@@ -6,7 +6,7 @@ import com.example.apprecetas.user.domain.entity.User;
import
com.example.apprecetas.user.domain.repository.ReadUserRepository
;
import
com.example.apprecetas.user.domain.repository.UpdateUserRepository
;
import
com.example.apprecetas.user.infrastructure.mapper.UserMapper
;
import
com.example.apprecetas.user.infrastructure.repository.
jpa.UserJpa
;
import
com.example.apprecetas.user.infrastructure.repository.
mongodb.UserDocument
;
import
lombok.RequiredArgsConstructor
;
import
org.mapstruct.factory.Mappers
;
import
org.springframework.stereotype.Service
;
...
...
@@ -21,14 +21,14 @@ public class UpdateUserUseCaseImpl implements UpdateUserUseCase {
private
final
UserMapper
mapper
=
Mappers
.
getMapper
(
UserMapper
.
class
);
@Override
public
User
updateById
(
Lo
ng
id
,
User
inputUser
)
{
User
Jpa
userJpa
=
readUserRepository
.
readById
(
id
)
public
User
updateById
(
Stri
ng
id
,
User
inputUser
)
{
User
Document
userDocument
=
readUserRepository
.
readById
(
id
)
.
orElseThrow
(()
->
new
EntityNotFoundException
(
"Usuario con id "
+
id
+
" no encontrado"
));
User
Jpa
user
=
mapper
.
mapJpa
(
inputUser
);
User
Document
user
=
mapper
.
mapDocument
(
inputUser
);
User
Jpa
modifiedUser
=
updateUserRepository
.
updateById
(
id
,
user
).
get
();
User
Document
modifiedUser
=
updateUserRepository
.
updateById
(
id
,
user
).
get
();
return
mapper
.
map
Jpa
(
modifiedUser
);
return
mapper
.
map
Document
(
modifiedUser
);
}
}
src/main/java/com/example/apprecetas/user/domain/entity/User.java
View file @
b1bcf0a3
...
...
@@ -9,7 +9,7 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor
public
class
User
{
private
Lo
ng
id
;
private
Stri
ng
id
;
private
String
name
;
private
String
surname
;
private
String
email
;
...
...
src/main/java/com/example/apprecetas/user/domain/repository/CreateUserRepository.java
View file @
b1bcf0a3
package
com
.
example
.
apprecetas
.
user
.
domain
.
repository
;
import
com.example.apprecetas.user.infrastructure.repository.
jpa.UserJpa
;
import
com.example.apprecetas.user.infrastructure.repository.
mongodb.UserDocument
;
public
interface
CreateUserRepository
{
User
Jpa
create
(
UserJpa
userJpa
);
User
Document
create
(
UserDocument
userDocument
);
}
src/main/java/com/example/apprecetas/user/domain/repository/DeleteUserRepository.java
View file @
b1bcf0a3
...
...
@@ -2,6 +2,6 @@ package com.example.apprecetas.user.domain.repository;
public
interface
DeleteUserRepository
{
void
deleteById
(
Lo
ng
id
);
void
deleteById
(
Stri
ng
id
);
}
src/main/java/com/example/apprecetas/user/domain/repository/ReadUserRepository.java
View file @
b1bcf0a3
package
com
.
example
.
apprecetas
.
user
.
domain
.
repository
;
import
com.example.apprecetas.user.infrastructure.repository.
jpa.UserJpa
;
import
com.example.apprecetas.user.infrastructure.repository.
mongodb.UserDocument
;
import
java.util.List
;
import
java.util.Optional
;
public
interface
ReadUserRepository
{
Optional
<
User
Jpa
>
readById
(
Lo
ng
id
);
Optional
<
User
Document
>
readById
(
Stri
ng
id
);
List
<
User
Jpa
>
readAll
();
List
<
User
Document
>
readAll
();
}
src/main/java/com/example/apprecetas/user/domain/repository/UpdateUserRepository.java
View file @
b1bcf0a3
package
com
.
example
.
apprecetas
.
user
.
domain
.
repository
;
import
com.example.apprecetas.user.infrastructure.repository.
jpa.UserJpa
;
import
com.example.apprecetas.user.infrastructure.repository.
mongodb.UserDocument
;
import
java.util.Optional
;
public
interface
UpdateUserRepository
{
Optional
<
User
Jpa
>
updateById
(
Long
id
,
UserJpa
userJpa
);
Optional
<
User
Document
>
updateById
(
String
id
,
UserDocument
userDocument
);
}
src/main/java/com/example/apprecetas/user/infrastructure/controller/DeleteUserController.java
View file @
b1bcf0a3
...
...
@@ -16,7 +16,7 @@ public class DeleteUserController {
private
final
DeleteUserUseCase
service
;
@DeleteMapping
(
"/{id}"
)
public
ResponseEntity
<
String
>
deleteById
(
@PathVariable
Lo
ng
id
)
{
public
ResponseEntity
<
String
>
deleteById
(
@PathVariable
Stri
ng
id
)
{
service
.
deleteById
(
id
);
return
ResponseEntity
.
ok
().
body
(
"Usuario con id "
+
id
+
" eliminado correctamente"
);
}
...
...
src/main/java/com/example/apprecetas/user/infrastructure/controller/ReadUserController.java
View file @
b1bcf0a3
...
...
@@ -23,7 +23,7 @@ public class ReadUserController {
private
final
UserMapper
mapper
=
Mappers
.
getMapper
(
UserMapper
.
class
);
@GetMapping
(
"/{id}"
)
public
ResponseEntity
<
UserOutputDto
>
readById
(
@PathVariable
Lo
ng
id
)
{
public
ResponseEntity
<
UserOutputDto
>
readById
(
@PathVariable
Stri
ng
id
)
{
return
ResponseEntity
.
ok
().
body
(
mapper
.
map
(
service
.
readById
(
id
)));
}
...
...
src/main/java/com/example/apprecetas/user/infrastructure/controller/UpdateUserController.java
View file @
b1bcf0a3
...
...
@@ -24,7 +24,7 @@ public class UpdateUserController {
private
final
UserMapper
mapper
=
Mappers
.
getMapper
(
UserMapper
.
class
);
@PutMapping
(
"/{id}"
)
public
ResponseEntity
<
UserOutputDto
>
update
(
@PathVariable
Lo
ng
id
,
@Valid
@RequestBody
UserInputDto
userInputDto
,
BindingResult
result
)
{
public
ResponseEntity
<
UserOutputDto
>
update
(
@PathVariable
Stri
ng
id
,
@Valid
@RequestBody
UserInputDto
userInputDto
,
BindingResult
result
)
{
if
(
result
.
hasErrors
())
{
String
errorMsg
=
result
.
getFieldErrors
().
stream
()
.
map
(
fieldError
->
fieldError
.
getField
()
+
": "
+
fieldError
.
getDefaultMessage
())
...
...
src/main/java/com/example/apprecetas/user/infrastructure/controller/dto/UserOutputDto.java
View file @
b1bcf0a3
...
...
@@ -9,7 +9,7 @@ import lombok.NoArgsConstructor;
@NoArgsConstructor
public
class
UserOutputDto
{
private
Lo
ng
id
;
private
Stri
ng
id
;
private
String
name
;
private
String
surname
;
private
String
email
;
...
...
src/main/java/com/example/apprecetas/user/infrastructure/mapper/UserMapper.java
View file @
b1bcf0a3
...
...
@@ -3,7 +3,7 @@ package com.example.apprecetas.user.infrastructure.mapper;
import
com.example.apprecetas.user.domain.entity.User
;
import
com.example.apprecetas.user.infrastructure.controller.dto.UserInputDto
;
import
com.example.apprecetas.user.infrastructure.controller.dto.UserOutputDto
;
import
com.example.apprecetas.user.infrastructure.repository.
jpa.UserJpa
;
import
com.example.apprecetas.user.infrastructure.repository.
mongodb.UserDocument
;
import
org.mapstruct.Mapper
;
@Mapper
...
...
@@ -13,8 +13,8 @@ public interface UserMapper {
UserOutputDto
map
(
User
user
);
User
Jpa
mapJpa
(
User
user
);
User
Document
mapDocument
(
User
user
);
User
map
Jpa
(
UserJpa
userJpa
);
User
map
Document
(
UserDocument
userDocument
);
}
src/main/java/com/example/apprecetas/user/infrastructure/repository/impl/CreateUserRepositoryImpl.java
View file @
b1bcf0a3
package
com
.
example
.
apprecetas
.
user
.
infrastructure
.
repository
.
impl
;
import
com.example.apprecetas.user.domain.repository.CreateUserRepository
;
import
com.example.apprecetas.user.infrastructure.repository.
jpa.UserJpa
;
import
com.example.apprecetas.user.infrastructure.repository.
jpa.UserRepositoryJpa
;
import
com.example.apprecetas.user.infrastructure.repository.
mongodb.UserDocument
;
import
com.example.apprecetas.user.infrastructure.repository.
mongodb.UserRepository
;
import
lombok.RequiredArgsConstructor
;
import
org.springframework.stereotype.Repository
;
...
...
@@ -10,10 +10,10 @@ import org.springframework.stereotype.Repository;
@RequiredArgsConstructor
public
class
CreateUserRepositoryImpl
implements
CreateUserRepository
{
private
final
UserRepository
Jpa
repositoryJpa
;
private
final
UserRepository
repositoryJpa
;
@Override
public
User
Jpa
create
(
UserJpa
userJpa
)
{
return
repositoryJpa
.
save
(
user
Jpa
);
public
User
Document
create
(
UserDocument
userDocument
)
{
return
repositoryJpa
.
save
(
user
Document
);
}
}
src/main/java/com/example/apprecetas/user/infrastructure/repository/impl/DeleteUserRepositoryImpl.java
View file @
b1bcf0a3
package
com
.
example
.
apprecetas
.
user
.
infrastructure
.
repository
.
impl
;
import
com.example.apprecetas.user.domain.repository.DeleteUserRepository
;
import
com.example.apprecetas.user.infrastructure.repository.
jpa.UserRepositoryJpa
;
import
com.example.apprecetas.user.infrastructure.repository.
mongodb.UserRepository
;
import
lombok.RequiredArgsConstructor
;
import
org.springframework.stereotype.Repository
;
...
...
@@ -9,10 +9,10 @@ import org.springframework.stereotype.Repository;
@RequiredArgsConstructor
public
class
DeleteUserRepositoryImpl
implements
DeleteUserRepository
{
private
final
UserRepository
Jpa
repositoryJpa
;
private
final
UserRepository
repositoryJpa
;
@Override
public
void
deleteById
(
Lo
ng
id
)
{
public
void
deleteById
(
Stri
ng
id
)
{
repositoryJpa
.
deleteById
(
id
);
}
}
src/main/java/com/example/apprecetas/user/infrastructure/repository/impl/ReadUserRepositoryImpl.java
View file @
b1bcf0a3
package
com
.
example
.
apprecetas
.
user
.
infrastructure
.
repository
.
impl
;
import
com.example.apprecetas.user.domain.repository.ReadUserRepository
;
import
com.example.apprecetas.user.infrastructure.repository.
jpa.UserJpa
;
import
com.example.apprecetas.user.infrastructure.repository.
jpa.UserRepositoryJpa
;
import
com.example.apprecetas.user.infrastructure.repository.
mongodb.UserDocument
;
import
com.example.apprecetas.user.infrastructure.repository.
mongodb.UserRepository
;
import
lombok.RequiredArgsConstructor
;
import
org.springframework.stereotype.Repository
;
...
...
@@ -13,15 +13,15 @@ import java.util.Optional;
@RequiredArgsConstructor
public
class
ReadUserRepositoryImpl
implements
ReadUserRepository
{
private
final
UserRepository
Jpa
repositoryJpa
;
private
final
UserRepository
repositoryJpa
;
@Override
public
Optional
<
User
Jpa
>
readById
(
Lo
ng
id
)
{
public
Optional
<
User
Document
>
readById
(
Stri
ng
id
)
{
return
repositoryJpa
.
findById
(
id
);
}
@Override
public
List
<
User
Jpa
>
readAll
()
{
public
List
<
User
Document
>
readAll
()
{
return
repositoryJpa
.
findAll
();
}
}
src/main/java/com/example/apprecetas/user/infrastructure/repository/impl/UpdateUserRepositoryImpl.java
View file @
b1bcf0a3
package
com
.
example
.
apprecetas
.
user
.
infrastructure
.
repository
.
impl
;
import
com.example.apprecetas.user.domain.repository.UpdateUserRepository
;
import
com.example.apprecetas.user.infrastructure.repository.
jpa.UserJpa
;
import
com.example.apprecetas.user.infrastructure.repository.
jpa.UserRepositoryJpa
;
import
com.example.apprecetas.user.infrastructure.repository.
mongodb.UserDocument
;
import
com.example.apprecetas.user.infrastructure.repository.
mongodb.UserRepository
;
import
lombok.RequiredArgsConstructor
;
import
org.springframework.security.crypto.password.PasswordEncoder
;
import
org.springframework.stereotype.Repository
;
...
...
@@ -13,20 +13,20 @@ import java.util.Optional;
@RequiredArgsConstructor
public
class
UpdateUserRepositoryImpl
implements
UpdateUserRepository
{
private
final
UserRepository
Jpa
repositoryJpa
;
private
final
UserRepository
repositoryJpa
;
private
final
PasswordEncoder
passwordEncoder
;
@Override
public
Optional
<
User
Jpa
>
updateById
(
Long
id
,
UserJpa
userJpa
)
{
Optional
<
User
Jpa
>
userJpaOptional
=
repositoryJpa
.
findById
(
id
);
public
Optional
<
User
Document
>
updateById
(
String
id
,
UserDocument
userDocument
)
{
Optional
<
User
Document
>
userJpaOptional
=
repositoryJpa
.
findById
(
id
);
userJpaOptional
.
ifPresent
(
jpa
->
{
jpa
.
setId
(
id
);
jpa
.
setName
(
user
Jpa
.
getName
());
jpa
.
setSurname
(
user
Jpa
.
getSurname
());
jpa
.
setEmail
(
user
Jpa
.
getEmail
());
jpa
.
setPassword
(
passwordEncoder
.
encode
(
user
Jpa
.
getPassword
()));
jpa
.
setName
(
user
Document
.
getName
());
jpa
.
setSurname
(
user
Document
.
getSurname
());
jpa
.
setEmail
(
user
Document
.
getEmail
());
jpa
.
setPassword
(
passwordEncoder
.
encode
(
user
Document
.
getPassword
()));
});
return
userJpaOptional
.
map
(
repositoryJpa:
:
save
);
...
...
src/main/java/com/example/apprecetas/user/infrastructure/repository/jpa/UserRepositoryJpa.java
deleted
100644 → 0
View file @
d999d328
package
com
.
example
.
apprecetas
.
user
.
infrastructure
.
repository
.
jpa
;
import
org.springframework.data.jpa.repository.JpaRepository
;
public
interface
UserRepositoryJpa
extends
JpaRepository
<
UserJpa
,
Long
>
{
}
src/main/java/com/example/apprecetas/user/infrastructure/repository/
jpa/UserJpa
.java
→
src/main/java/com/example/apprecetas/user/infrastructure/repository/
mongodb/UserDocument
.java
View file @
b1bcf0a3
package
com
.
example
.
apprecetas
.
user
.
infrastructure
.
repository
.
jpa
;
package
com
.
example
.
apprecetas
.
user
.
infrastructure
.
repository
.
mongodb
;
import
jakarta.persistence.*
;
import
lombok.Getter
;
import
lombok.Setter
;
import
org.springframework.data.mongodb.core.mapping.Document
;
@Entity
@Table
(
name
=
"users"
)
@Document
(
collection
=
"users"
)
@Getter
@Setter
public
class
User
Jpa
{
public
class
User
Document
{
@Id
@GeneratedValue
(
strategy
=
GenerationType
.
IDENTITY
)
@Column
(
name
=
"id_usuario"
)
private
Lo
ng
id
;
private
Stri
ng
id
;
@Column
(
name
=
"nombre"
)
private
String
name
;
...
...
src/main/java/com/example/apprecetas/user/infrastructure/repository/mongodb/UserRepository.java
0 → 100644
View file @
b1bcf0a3
package
com
.
example
.
apprecetas
.
user
.
infrastructure
.
repository
.
mongodb
;
import
org.springframework.data.mongodb.repository.MongoRepository
;
public
interface
UserRepository
extends
MongoRepository
<
UserDocument
,
String
>
{
}
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment