LabWork4 is done.
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -22,6 +22,7 @@ dependencies {
|
||||
testImplementation 'org.springframework.boot:spring-boot-starter-test'
|
||||
}
|
||||
|
||||
|
||||
tasks.named('test') {
|
||||
useJUnitPlatform()
|
||||
}
|
||||
|
||||
BIN
data.mv.db
BIN
data.mv.db
Binary file not shown.
492
data.trace.db
492
data.trace.db
@@ -1,150 +1,360 @@
|
||||
2023-05-23 17:16:13 jdbc[3]: exception
|
||||
org.h2.jdbc.JdbcSQLSyntaxErrorException: Constraint "FKYNXS3N2T3DB15LSW7A0J21FE" already exists; SQL statement:
|
||||
alter table customer_movies add constraint FKynxs3n2t3db15lsw7a0j21fe foreign key (movies_id) references movie [90045-214]
|
||||
at org.h2.message.DbException.getJdbcSQLException(DbException.java:632)
|
||||
2023-05-24 22:46:14 jdbc[3]: exception
|
||||
org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "GENRE" not found; SQL statement:
|
||||
select genre0_.id as id1_2_, genre0_.name as name2_2_ from genre genre0_ where genre0_.name like genre [42122-214]
|
||||
at org.h2.message.DbException.getJdbcSQLException(DbException.java:502)
|
||||
at org.h2.message.DbException.getJdbcSQLException(DbException.java:477)
|
||||
at org.h2.message.DbException.get(DbException.java:223)
|
||||
at org.h2.message.DbException.get(DbException.java:199)
|
||||
at org.h2.command.ddl.AlterTableAddConstraint.tryUpdate(AlterTableAddConstraint.java:109)
|
||||
at org.h2.command.ddl.AlterTableAddConstraint.update(AlterTableAddConstraint.java:72)
|
||||
at org.h2.command.ddl.AlterTable.update(AlterTable.java:46)
|
||||
at org.h2.command.CommandContainer.update(CommandContainer.java:169)
|
||||
at org.h2.command.Command.executeUpdate(Command.java:252)
|
||||
at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:252)
|
||||
at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:223)
|
||||
at com.zaxxer.hikari.pool.ProxyStatement.execute(ProxyStatement.java:94)
|
||||
at com.zaxxer.hikari.pool.HikariProxyStatement.execute(HikariProxyStatement.java)
|
||||
at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:54)
|
||||
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applySqlString(AbstractSchemaMigrator.java:581)
|
||||
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applySqlStrings(AbstractSchemaMigrator.java:526)
|
||||
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applyForeignKeys(AbstractSchemaMigrator.java:452)
|
||||
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.performMigration(AbstractSchemaMigrator.java:263)
|
||||
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.doMigration(AbstractSchemaMigrator.java:123)
|
||||
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:192)
|
||||
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:81)
|
||||
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:335)
|
||||
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:471)
|
||||
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1498)
|
||||
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58)
|
||||
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365)
|
||||
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409)
|
||||
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396)
|
||||
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
|
||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
|
||||
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1154)
|
||||
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:908)
|
||||
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583)
|
||||
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145)
|
||||
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732)
|
||||
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:414)
|
||||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:302)
|
||||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303)
|
||||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292)
|
||||
at ru.ulstu.is.sbapp.SbappApplication.main(SbappApplication.java:13)
|
||||
2023-05-23 17:16:13 jdbc[3]: exception
|
||||
org.h2.jdbc.JdbcSQLSyntaxErrorException: Constraint "FK9IRIVJCNCAUMV1TUDWT0TP500" already exists; SQL statement:
|
||||
alter table customer_movies add constraint FK9irivjcncaumv1tudwt0tp500 foreign key (customer_id) references customer [90045-214]
|
||||
at org.h2.message.DbException.getJdbcSQLException(DbException.java:632)
|
||||
at org.h2.expression.ExpressionColumn.getColumnException(ExpressionColumn.java:244)
|
||||
at org.h2.expression.ExpressionColumn.optimizeOther(ExpressionColumn.java:226)
|
||||
at org.h2.expression.ExpressionColumn.optimize(ExpressionColumn.java:213)
|
||||
at org.h2.expression.condition.CompareLike.optimize(CompareLike.java:150)
|
||||
at org.h2.expression.Expression.optimizeCondition(Expression.java:148)
|
||||
at org.h2.command.query.Select.prepareExpressions(Select.java:1177)
|
||||
at org.h2.command.query.Query.prepare(Query.java:218)
|
||||
at org.h2.command.Parser.prepareCommand(Parser.java:575)
|
||||
at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:631)
|
||||
at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:554)
|
||||
at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1116)
|
||||
at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:92)
|
||||
at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:288)
|
||||
at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:337)
|
||||
at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java)
|
||||
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:149)
|
||||
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:176)
|
||||
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:151)
|
||||
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:2122)
|
||||
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2059)
|
||||
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2037)
|
||||
at org.hibernate.loader.Loader.doQuery(Loader.java:956)
|
||||
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:357)
|
||||
at org.hibernate.loader.Loader.doList(Loader.java:2868)
|
||||
at org.hibernate.loader.Loader.doList(Loader.java:2850)
|
||||
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2682)
|
||||
at org.hibernate.loader.Loader.list(Loader.java:2677)
|
||||
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:540)
|
||||
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:400)
|
||||
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:219)
|
||||
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1454)
|
||||
at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1649)
|
||||
at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1617)
|
||||
at org.hibernate.query.internal.AbstractProducedQuery.getSingleResult(AbstractProducedQuery.java:1665)
|
||||
at org.springframework.data.jpa.repository.query.JpaQueryExecution$SingleEntityExecution.doExecute(JpaQueryExecution.java:198)
|
||||
at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:90)
|
||||
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:155)
|
||||
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:143)
|
||||
at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:137)
|
||||
at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:121)
|
||||
at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:159)
|
||||
at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:138)
|
||||
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
|
||||
at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:80)
|
||||
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
|
||||
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123)
|
||||
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388)
|
||||
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)
|
||||
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
|
||||
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137)
|
||||
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
|
||||
at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:145)
|
||||
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
|
||||
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)
|
||||
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
|
||||
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215)
|
||||
at jdk.proxy2/jdk.proxy2.$Proxy118.findByName(Unknown Source)
|
||||
at ru.ulstu.is.sbapp.Movie.Service.MovieService.fillRepo(MovieService.java:194)
|
||||
at ru.ulstu.is.sbapp.Movie.Service.MovieService$$FastClassBySpringCGLIB$$bb620b80.invoke(<generated>)
|
||||
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
|
||||
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689)
|
||||
at ru.ulstu.is.sbapp.Movie.Service.MovieService$$EnhancerBySpringCGLIB$$7d3e602e.fillRepo(<generated>)
|
||||
at ru.ulstu.is.sbapp.Movie.Controller.MovieController.insertMovies(MovieController.java:65)
|
||||
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
|
||||
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
|
||||
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
|
||||
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
|
||||
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
|
||||
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)
|
||||
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)
|
||||
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
|
||||
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)
|
||||
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
|
||||
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067)
|
||||
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)
|
||||
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
|
||||
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
|
||||
at javax.servlet.http.HttpServlet.service(HttpServlet.java:681)
|
||||
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
|
||||
at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
|
||||
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
|
||||
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
|
||||
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
|
||||
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
|
||||
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
|
||||
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
|
||||
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
|
||||
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
|
||||
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
|
||||
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
|
||||
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
|
||||
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
|
||||
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
|
||||
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
|
||||
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
|
||||
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
|
||||
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
|
||||
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
|
||||
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
|
||||
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540)
|
||||
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
|
||||
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
|
||||
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
|
||||
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)
|
||||
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382)
|
||||
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
|
||||
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895)
|
||||
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1732)
|
||||
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
|
||||
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
|
||||
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
|
||||
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
|
||||
at java.base/java.lang.Thread.run(Thread.java:833)
|
||||
2023-05-24 23:03:06 jdbc[4]: exception
|
||||
org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "GENRE" not found; SQL statement:
|
||||
select genre0_.id as id1_2_, genre0_.name as name2_2_ from genre genre0_ where genre0_.name like genre [42122-214]
|
||||
at org.h2.message.DbException.getJdbcSQLException(DbException.java:502)
|
||||
at org.h2.message.DbException.getJdbcSQLException(DbException.java:477)
|
||||
at org.h2.message.DbException.get(DbException.java:223)
|
||||
at org.h2.message.DbException.get(DbException.java:199)
|
||||
at org.h2.command.ddl.AlterTableAddConstraint.tryUpdate(AlterTableAddConstraint.java:109)
|
||||
at org.h2.command.ddl.AlterTableAddConstraint.update(AlterTableAddConstraint.java:72)
|
||||
at org.h2.command.ddl.AlterTable.update(AlterTable.java:46)
|
||||
at org.h2.command.CommandContainer.update(CommandContainer.java:169)
|
||||
at org.h2.command.Command.executeUpdate(Command.java:252)
|
||||
at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:252)
|
||||
at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:223)
|
||||
at com.zaxxer.hikari.pool.ProxyStatement.execute(ProxyStatement.java:94)
|
||||
at com.zaxxer.hikari.pool.HikariProxyStatement.execute(HikariProxyStatement.java)
|
||||
at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:54)
|
||||
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applySqlString(AbstractSchemaMigrator.java:581)
|
||||
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applySqlStrings(AbstractSchemaMigrator.java:526)
|
||||
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applyForeignKeys(AbstractSchemaMigrator.java:452)
|
||||
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.performMigration(AbstractSchemaMigrator.java:263)
|
||||
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.doMigration(AbstractSchemaMigrator.java:123)
|
||||
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:192)
|
||||
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:81)
|
||||
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:335)
|
||||
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:471)
|
||||
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1498)
|
||||
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58)
|
||||
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365)
|
||||
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409)
|
||||
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396)
|
||||
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
|
||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
|
||||
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1154)
|
||||
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:908)
|
||||
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583)
|
||||
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145)
|
||||
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732)
|
||||
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:414)
|
||||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:302)
|
||||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303)
|
||||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292)
|
||||
at ru.ulstu.is.sbapp.SbappApplication.main(SbappApplication.java:13)
|
||||
2023-05-23 17:16:13 jdbc[3]: exception
|
||||
org.h2.jdbc.JdbcSQLSyntaxErrorException: Constraint "FK3106DKJT5HW3VT0WDBDTWAWBD" already exists; SQL statement:
|
||||
alter table movie add constraint FK3106dkjt5hw3vt0wdbdtwawbd foreign key (genre_fk) references genre [90045-214]
|
||||
at org.h2.message.DbException.getJdbcSQLException(DbException.java:632)
|
||||
at org.h2.expression.ExpressionColumn.getColumnException(ExpressionColumn.java:244)
|
||||
at org.h2.expression.ExpressionColumn.optimizeOther(ExpressionColumn.java:226)
|
||||
at org.h2.expression.ExpressionColumn.optimize(ExpressionColumn.java:213)
|
||||
at org.h2.expression.condition.CompareLike.optimize(CompareLike.java:150)
|
||||
at org.h2.expression.Expression.optimizeCondition(Expression.java:148)
|
||||
at org.h2.command.query.Select.prepareExpressions(Select.java:1177)
|
||||
at org.h2.command.query.Query.prepare(Query.java:218)
|
||||
at org.h2.command.Parser.prepareCommand(Parser.java:575)
|
||||
at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:631)
|
||||
at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:554)
|
||||
at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1116)
|
||||
at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:92)
|
||||
at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:288)
|
||||
at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:337)
|
||||
at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java)
|
||||
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:149)
|
||||
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:176)
|
||||
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:151)
|
||||
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:2122)
|
||||
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2059)
|
||||
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2037)
|
||||
at org.hibernate.loader.Loader.doQuery(Loader.java:956)
|
||||
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:357)
|
||||
at org.hibernate.loader.Loader.doList(Loader.java:2868)
|
||||
at org.hibernate.loader.Loader.doList(Loader.java:2850)
|
||||
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2682)
|
||||
at org.hibernate.loader.Loader.list(Loader.java:2677)
|
||||
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:540)
|
||||
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:400)
|
||||
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:219)
|
||||
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1454)
|
||||
at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1649)
|
||||
at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1617)
|
||||
at org.hibernate.query.internal.AbstractProducedQuery.getSingleResult(AbstractProducedQuery.java:1665)
|
||||
at org.springframework.data.jpa.repository.query.JpaQueryExecution$SingleEntityExecution.doExecute(JpaQueryExecution.java:198)
|
||||
at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:90)
|
||||
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:155)
|
||||
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:143)
|
||||
at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:137)
|
||||
at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:121)
|
||||
at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:159)
|
||||
at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:138)
|
||||
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
|
||||
at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:80)
|
||||
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
|
||||
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123)
|
||||
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388)
|
||||
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)
|
||||
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
|
||||
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137)
|
||||
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
|
||||
at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:145)
|
||||
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
|
||||
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)
|
||||
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
|
||||
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215)
|
||||
at jdk.proxy2/jdk.proxy2.$Proxy118.findByName(Unknown Source)
|
||||
at ru.ulstu.is.sbapp.Movie.Service.MovieService.fillRepo(MovieService.java:194)
|
||||
at ru.ulstu.is.sbapp.Movie.Service.MovieService$$FastClassBySpringCGLIB$$bb620b80.invoke(<generated>)
|
||||
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
|
||||
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689)
|
||||
at ru.ulstu.is.sbapp.Movie.Service.MovieService$$EnhancerBySpringCGLIB$$e0f68ee9.fillRepo(<generated>)
|
||||
at ru.ulstu.is.sbapp.Movie.Controller.MovieController.insertMovies(MovieController.java:65)
|
||||
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
|
||||
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
|
||||
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
|
||||
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
|
||||
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
|
||||
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)
|
||||
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)
|
||||
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
|
||||
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)
|
||||
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
|
||||
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067)
|
||||
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)
|
||||
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
|
||||
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
|
||||
at javax.servlet.http.HttpServlet.service(HttpServlet.java:681)
|
||||
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
|
||||
at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
|
||||
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
|
||||
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
|
||||
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
|
||||
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
|
||||
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
|
||||
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
|
||||
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
|
||||
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
|
||||
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
|
||||
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
|
||||
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
|
||||
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
|
||||
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
|
||||
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
|
||||
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
|
||||
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
|
||||
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
|
||||
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
|
||||
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
|
||||
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540)
|
||||
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
|
||||
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
|
||||
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
|
||||
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)
|
||||
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382)
|
||||
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
|
||||
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895)
|
||||
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1732)
|
||||
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
|
||||
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
|
||||
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
|
||||
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
|
||||
at java.base/java.lang.Thread.run(Thread.java:833)
|
||||
2023-05-24 23:20:24 jdbc[3]: exception
|
||||
org.h2.jdbc.JdbcSQLSyntaxErrorException: Column "GENRE" not found; SQL statement:
|
||||
select genre0_.id as id1_2_, genre0_.name as name2_2_ from genre genre0_ where genre0_.name like genre [42122-214]
|
||||
at org.h2.message.DbException.getJdbcSQLException(DbException.java:502)
|
||||
at org.h2.message.DbException.getJdbcSQLException(DbException.java:477)
|
||||
at org.h2.message.DbException.get(DbException.java:223)
|
||||
at org.h2.message.DbException.get(DbException.java:199)
|
||||
at org.h2.command.ddl.AlterTableAddConstraint.tryUpdate(AlterTableAddConstraint.java:109)
|
||||
at org.h2.command.ddl.AlterTableAddConstraint.update(AlterTableAddConstraint.java:72)
|
||||
at org.h2.command.ddl.AlterTable.update(AlterTable.java:46)
|
||||
at org.h2.command.CommandContainer.update(CommandContainer.java:169)
|
||||
at org.h2.command.Command.executeUpdate(Command.java:252)
|
||||
at org.h2.jdbc.JdbcStatement.executeInternal(JdbcStatement.java:252)
|
||||
at org.h2.jdbc.JdbcStatement.execute(JdbcStatement.java:223)
|
||||
at com.zaxxer.hikari.pool.ProxyStatement.execute(ProxyStatement.java:94)
|
||||
at com.zaxxer.hikari.pool.HikariProxyStatement.execute(HikariProxyStatement.java)
|
||||
at org.hibernate.tool.schema.internal.exec.GenerationTargetToDatabase.accept(GenerationTargetToDatabase.java:54)
|
||||
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applySqlString(AbstractSchemaMigrator.java:581)
|
||||
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applySqlStrings(AbstractSchemaMigrator.java:526)
|
||||
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.applyForeignKeys(AbstractSchemaMigrator.java:452)
|
||||
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.performMigration(AbstractSchemaMigrator.java:263)
|
||||
at org.hibernate.tool.schema.internal.AbstractSchemaMigrator.doMigration(AbstractSchemaMigrator.java:123)
|
||||
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.performDatabaseAction(SchemaManagementToolCoordinator.java:192)
|
||||
at org.hibernate.tool.schema.spi.SchemaManagementToolCoordinator.process(SchemaManagementToolCoordinator.java:81)
|
||||
at org.hibernate.internal.SessionFactoryImpl.<init>(SessionFactoryImpl.java:335)
|
||||
at org.hibernate.boot.internal.SessionFactoryBuilderImpl.build(SessionFactoryBuilderImpl.java:471)
|
||||
at org.hibernate.jpa.boot.internal.EntityManagerFactoryBuilderImpl.build(EntityManagerFactoryBuilderImpl.java:1498)
|
||||
at org.springframework.orm.jpa.vendor.SpringHibernateJpaPersistenceProvider.createContainerEntityManagerFactory(SpringHibernateJpaPersistenceProvider.java:58)
|
||||
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.createNativeEntityManagerFactory(LocalContainerEntityManagerFactoryBean.java:365)
|
||||
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.buildNativeEntityManagerFactory(AbstractEntityManagerFactoryBean.java:409)
|
||||
at org.springframework.orm.jpa.AbstractEntityManagerFactoryBean.afterPropertiesSet(AbstractEntityManagerFactoryBean.java:396)
|
||||
at org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean.afterPropertiesSet(LocalContainerEntityManagerFactoryBean.java:341)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.invokeInitMethods(AbstractAutowireCapableBeanFactory.java:1863)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.initializeBean(AbstractAutowireCapableBeanFactory.java:1800)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.doCreateBean(AbstractAutowireCapableBeanFactory.java:620)
|
||||
at org.springframework.beans.factory.support.AbstractAutowireCapableBeanFactory.createBean(AbstractAutowireCapableBeanFactory.java:542)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.lambda$doGetBean$0(AbstractBeanFactory.java:335)
|
||||
at org.springframework.beans.factory.support.DefaultSingletonBeanRegistry.getSingleton(DefaultSingletonBeanRegistry.java:234)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.doGetBean(AbstractBeanFactory.java:333)
|
||||
at org.springframework.beans.factory.support.AbstractBeanFactory.getBean(AbstractBeanFactory.java:208)
|
||||
at org.springframework.context.support.AbstractApplicationContext.getBean(AbstractApplicationContext.java:1154)
|
||||
at org.springframework.context.support.AbstractApplicationContext.finishBeanFactoryInitialization(AbstractApplicationContext.java:908)
|
||||
at org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:583)
|
||||
at org.springframework.boot.web.servlet.context.ServletWebServerApplicationContext.refresh(ServletWebServerApplicationContext.java:145)
|
||||
at org.springframework.boot.SpringApplication.refresh(SpringApplication.java:732)
|
||||
at org.springframework.boot.SpringApplication.refreshContext(SpringApplication.java:414)
|
||||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:302)
|
||||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1303)
|
||||
at org.springframework.boot.SpringApplication.run(SpringApplication.java:1292)
|
||||
at ru.ulstu.is.sbapp.SbappApplication.main(SbappApplication.java:13)
|
||||
at org.h2.expression.ExpressionColumn.getColumnException(ExpressionColumn.java:244)
|
||||
at org.h2.expression.ExpressionColumn.optimizeOther(ExpressionColumn.java:226)
|
||||
at org.h2.expression.ExpressionColumn.optimize(ExpressionColumn.java:213)
|
||||
at org.h2.expression.condition.CompareLike.optimize(CompareLike.java:150)
|
||||
at org.h2.expression.Expression.optimizeCondition(Expression.java:148)
|
||||
at org.h2.command.query.Select.prepareExpressions(Select.java:1177)
|
||||
at org.h2.command.query.Query.prepare(Query.java:218)
|
||||
at org.h2.command.Parser.prepareCommand(Parser.java:575)
|
||||
at org.h2.engine.SessionLocal.prepareLocal(SessionLocal.java:631)
|
||||
at org.h2.engine.SessionLocal.prepareCommand(SessionLocal.java:554)
|
||||
at org.h2.jdbc.JdbcConnection.prepareCommand(JdbcConnection.java:1116)
|
||||
at org.h2.jdbc.JdbcPreparedStatement.<init>(JdbcPreparedStatement.java:92)
|
||||
at org.h2.jdbc.JdbcConnection.prepareStatement(JdbcConnection.java:288)
|
||||
at com.zaxxer.hikari.pool.ProxyConnection.prepareStatement(ProxyConnection.java:337)
|
||||
at com.zaxxer.hikari.pool.HikariProxyConnection.prepareStatement(HikariProxyConnection.java)
|
||||
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$5.doPrepare(StatementPreparerImpl.java:149)
|
||||
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl$StatementPreparationTemplate.prepareStatement(StatementPreparerImpl.java:176)
|
||||
at org.hibernate.engine.jdbc.internal.StatementPreparerImpl.prepareQueryStatement(StatementPreparerImpl.java:151)
|
||||
at org.hibernate.loader.Loader.prepareQueryStatement(Loader.java:2122)
|
||||
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2059)
|
||||
at org.hibernate.loader.Loader.executeQueryStatement(Loader.java:2037)
|
||||
at org.hibernate.loader.Loader.doQuery(Loader.java:956)
|
||||
at org.hibernate.loader.Loader.doQueryAndInitializeNonLazyCollections(Loader.java:357)
|
||||
at org.hibernate.loader.Loader.doList(Loader.java:2868)
|
||||
at org.hibernate.loader.Loader.doList(Loader.java:2850)
|
||||
at org.hibernate.loader.Loader.listIgnoreQueryCache(Loader.java:2682)
|
||||
at org.hibernate.loader.Loader.list(Loader.java:2677)
|
||||
at org.hibernate.loader.hql.QueryLoader.list(QueryLoader.java:540)
|
||||
at org.hibernate.hql.internal.ast.QueryTranslatorImpl.list(QueryTranslatorImpl.java:400)
|
||||
at org.hibernate.engine.query.spi.HQLQueryPlan.performList(HQLQueryPlan.java:219)
|
||||
at org.hibernate.internal.SessionImpl.list(SessionImpl.java:1454)
|
||||
at org.hibernate.query.internal.AbstractProducedQuery.doList(AbstractProducedQuery.java:1649)
|
||||
at org.hibernate.query.internal.AbstractProducedQuery.list(AbstractProducedQuery.java:1617)
|
||||
at org.hibernate.query.internal.AbstractProducedQuery.getSingleResult(AbstractProducedQuery.java:1665)
|
||||
at org.springframework.data.jpa.repository.query.JpaQueryExecution$SingleEntityExecution.doExecute(JpaQueryExecution.java:198)
|
||||
at org.springframework.data.jpa.repository.query.JpaQueryExecution.execute(JpaQueryExecution.java:90)
|
||||
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.doExecute(AbstractJpaQuery.java:155)
|
||||
at org.springframework.data.jpa.repository.query.AbstractJpaQuery.execute(AbstractJpaQuery.java:143)
|
||||
at org.springframework.data.repository.core.support.RepositoryMethodInvoker.doInvoke(RepositoryMethodInvoker.java:137)
|
||||
at org.springframework.data.repository.core.support.RepositoryMethodInvoker.invoke(RepositoryMethodInvoker.java:121)
|
||||
at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.doInvoke(QueryExecutorMethodInterceptor.java:159)
|
||||
at org.springframework.data.repository.core.support.QueryExecutorMethodInterceptor.invoke(QueryExecutorMethodInterceptor.java:138)
|
||||
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
|
||||
at org.springframework.data.projection.DefaultMethodInvokingMethodInterceptor.invoke(DefaultMethodInvokingMethodInterceptor.java:80)
|
||||
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
|
||||
at org.springframework.transaction.interceptor.TransactionInterceptor$1.proceedWithInvocation(TransactionInterceptor.java:123)
|
||||
at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:388)
|
||||
at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:119)
|
||||
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
|
||||
at org.springframework.dao.support.PersistenceExceptionTranslationInterceptor.invoke(PersistenceExceptionTranslationInterceptor.java:137)
|
||||
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
|
||||
at org.springframework.data.jpa.repository.support.CrudMethodMetadataPostProcessor$CrudMethodMetadataPopulatingMethodInterceptor.invoke(CrudMethodMetadataPostProcessor.java:145)
|
||||
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
|
||||
at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:97)
|
||||
at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186)
|
||||
at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:215)
|
||||
at jdk.proxy2/jdk.proxy2.$Proxy118.findByName(Unknown Source)
|
||||
at ru.ulstu.is.sbapp.Movie.Service.MovieService.fillRepo(MovieService.java:194)
|
||||
at ru.ulstu.is.sbapp.Movie.Service.MovieService$$FastClassBySpringCGLIB$$bb620b80.invoke(<generated>)
|
||||
at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218)
|
||||
at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:689)
|
||||
at ru.ulstu.is.sbapp.Movie.Service.MovieService$$EnhancerBySpringCGLIB$$f55ccaf0.fillRepo(<generated>)
|
||||
at ru.ulstu.is.sbapp.Movie.Controller.MovieController.insertMovies(MovieController.java:66)
|
||||
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
|
||||
at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:77)
|
||||
at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
|
||||
at java.base/java.lang.reflect.Method.invoke(Method.java:568)
|
||||
at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205)
|
||||
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150)
|
||||
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:117)
|
||||
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:895)
|
||||
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:808)
|
||||
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87)
|
||||
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1067)
|
||||
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:963)
|
||||
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1006)
|
||||
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:909)
|
||||
at javax.servlet.http.HttpServlet.service(HttpServlet.java:681)
|
||||
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:883)
|
||||
at javax.servlet.http.HttpServlet.service(HttpServlet.java:764)
|
||||
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:227)
|
||||
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
|
||||
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
|
||||
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
|
||||
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
|
||||
at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:100)
|
||||
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
|
||||
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
|
||||
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
|
||||
at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:93)
|
||||
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
|
||||
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
|
||||
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
|
||||
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:201)
|
||||
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:117)
|
||||
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:189)
|
||||
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:162)
|
||||
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:197)
|
||||
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:97)
|
||||
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:540)
|
||||
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:135)
|
||||
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92)
|
||||
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:78)
|
||||
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:357)
|
||||
at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:382)
|
||||
at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:65)
|
||||
at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:895)
|
||||
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1732)
|
||||
at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49)
|
||||
at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
|
||||
at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
|
||||
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
|
||||
at java.base/java.lang.Thread.run(Thread.java:833)
|
||||
|
||||
257
frontend/package-lock.json
generated
257
frontend/package-lock.json
generated
@@ -12,8 +12,11 @@
|
||||
"@testing-library/react": "^13.4.0",
|
||||
"@testing-library/user-event": "^13.5.0",
|
||||
"axios": "^1.4.0",
|
||||
"bootstrap": "^5.2.3",
|
||||
"react": "^18.2.0",
|
||||
"react-bootstrap": "^2.7.4",
|
||||
"react-dom": "^18.2.0",
|
||||
"react-router-dom": "^6.11.2",
|
||||
"react-scripts": "5.0.1",
|
||||
"web-vitals": "^2.1.4"
|
||||
}
|
||||
@@ -3114,6 +3117,73 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/@popperjs/core": {
|
||||
"version": "2.11.7",
|
||||
"resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.7.tgz",
|
||||
"integrity": "sha512-Cr4OjIkipTtcXKjAsm8agyleBuDHvxzeBoa1v543lbv1YaIwQjESsVcmjiWiPEbC1FIeHOG/Op9kdCmAmiS3Kw==",
|
||||
"funding": {
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/popperjs"
|
||||
}
|
||||
},
|
||||
"node_modules/@react-aria/ssr": {
|
||||
"version": "3.6.0",
|
||||
"resolved": "https://registry.npmjs.org/@react-aria/ssr/-/ssr-3.6.0.tgz",
|
||||
"integrity": "sha512-OFiYQdv+Yk7AO7IsQu/fAEPijbeTwrrEYvdNoJ3sblBBedD5j5fBTNWrUPNVlwC4XWWnWTCMaRIVsJujsFiWXg==",
|
||||
"dependencies": {
|
||||
"@swc/helpers": "^0.4.14"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": "^16.8.0 || ^17.0.0-rc.1 || ^18.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@remix-run/router": {
|
||||
"version": "1.6.2",
|
||||
"resolved": "https://registry.npmjs.org/@remix-run/router/-/router-1.6.2.tgz",
|
||||
"integrity": "sha512-LzqpSrMK/3JBAVBI9u3NWtOhWNw5AMQfrUFYB0+bDHTSw17z++WJLsPsxAuK+oSddsxk4d7F/JcdDPM1M5YAhA==",
|
||||
"engines": {
|
||||
"node": ">=14"
|
||||
}
|
||||
},
|
||||
"node_modules/@restart/hooks": {
|
||||
"version": "0.4.9",
|
||||
"resolved": "https://registry.npmjs.org/@restart/hooks/-/hooks-0.4.9.tgz",
|
||||
"integrity": "sha512-3BekqcwB6Umeya+16XPooARn4qEPW6vNvwYnlofIYe6h9qG1/VeD7UvShCWx11eFz5ELYmwIEshz+MkPX3wjcQ==",
|
||||
"dependencies": {
|
||||
"dequal": "^2.0.2"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": ">=16.8.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@restart/ui": {
|
||||
"version": "1.6.5",
|
||||
"resolved": "https://registry.npmjs.org/@restart/ui/-/ui-1.6.5.tgz",
|
||||
"integrity": "sha512-kDjhH8lk+aVGc+dPb8wEBXRDx4B1WX6/pqyWi22R3Oim6KQokeLGO2g8MYzwd2/UdjsrDt+HyYFpKihLIN7+/A==",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.21.0",
|
||||
"@popperjs/core": "^2.11.6",
|
||||
"@react-aria/ssr": "^3.5.0",
|
||||
"@restart/hooks": "^0.4.9",
|
||||
"@types/warning": "^3.0.0",
|
||||
"dequal": "^2.0.3",
|
||||
"dom-helpers": "^5.2.0",
|
||||
"uncontrollable": "^8.0.1",
|
||||
"warning": "^4.0.3"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": ">=16.14.0",
|
||||
"react-dom": ">=16.14.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@restart/ui/node_modules/uncontrollable": {
|
||||
"version": "8.0.2",
|
||||
"resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-8.0.2.tgz",
|
||||
"integrity": "sha512-/GDx+K1STGtpgTsj5Dj3J51YaKxZDblbCQHTH1zHLuoBEWodj6MjtRVv3TUijj1JYLRLSFsFzN8NV4M3QV4d9w==",
|
||||
"peerDependencies": {
|
||||
"react": ">=16.14.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@rollup/plugin-babel": {
|
||||
"version": "5.3.1",
|
||||
"resolved": "https://registry.npmjs.org/@rollup/plugin-babel/-/plugin-babel-5.3.1.tgz",
|
||||
@@ -3432,6 +3502,14 @@
|
||||
"url": "https://github.com/sponsors/gregberge"
|
||||
}
|
||||
},
|
||||
"node_modules/@swc/helpers": {
|
||||
"version": "0.4.14",
|
||||
"resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.4.14.tgz",
|
||||
"integrity": "sha512-4C7nX/dvpzB7za4Ql9K81xK3HPxCpHMgwTZVyf+9JQ6VUbn9jjZVN7/Nkdz/Ugzs2CSjqnL/UPXroiVBVHUWUw==",
|
||||
"dependencies": {
|
||||
"tslib": "^2.4.0"
|
||||
}
|
||||
},
|
||||
"node_modules/@testing-library/dom": {
|
||||
"version": "9.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.0.tgz",
|
||||
@@ -4200,6 +4278,14 @@
|
||||
"@types/react": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/react-transition-group": {
|
||||
"version": "4.4.6",
|
||||
"resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.6.tgz",
|
||||
"integrity": "sha512-VnCdSxfcm08KjsJVQcfBmhEQAPnLB8G08hAxn39azX1qYBQ/5RVQuoHuKIcfKOdncuaUvEpFKFzEvbtIMsfVew==",
|
||||
"dependencies": {
|
||||
"@types/react": "*"
|
||||
}
|
||||
},
|
||||
"node_modules/@types/resolve": {
|
||||
"version": "1.17.1",
|
||||
"resolved": "https://registry.npmjs.org/@types/resolve/-/resolve-1.17.1.tgz",
|
||||
@@ -4275,6 +4361,11 @@
|
||||
"resolved": "https://registry.npmjs.org/@types/trusted-types/-/trusted-types-2.0.3.tgz",
|
||||
"integrity": "sha512-NfQ4gyz38SL8sDNrSixxU2Os1a5xcdFxipAFxYEuLUlvU2uDwS4NUpsImcf1//SlWItCVMMLiylsxbmNMToV/g=="
|
||||
},
|
||||
"node_modules/@types/warning": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@types/warning/-/warning-3.0.0.tgz",
|
||||
"integrity": "sha512-t/Tvs5qR47OLOr+4E9ckN8AmP2Tf16gWq+/qA4iUGS/OOyHVO8wv2vjJuX8SNOUTJyWb+2t7wJm6cXILFnOROA=="
|
||||
},
|
||||
"node_modules/@types/ws": {
|
||||
"version": "8.5.4",
|
||||
"resolved": "https://registry.npmjs.org/@types/ws/-/ws-8.5.4.tgz",
|
||||
@@ -5512,6 +5603,24 @@
|
||||
"resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
|
||||
"integrity": "sha512-JZOSA7Mo9sNGB8+UjSgzdLtokWAky1zbztM3WRLCbZ70/3cTANmQmOdR7y2g+J0e2WXywy1yS468tY+IruqEww=="
|
||||
},
|
||||
"node_modules/bootstrap": {
|
||||
"version": "5.2.3",
|
||||
"resolved": "https://registry.npmjs.org/bootstrap/-/bootstrap-5.2.3.tgz",
|
||||
"integrity": "sha512-cEKPM+fwb3cT8NzQZYEu4HilJ3anCrWqh3CHAok1p9jXqMPsPTBhU25fBckEJHJ/p+tTxTFTsFQGM+gaHpi3QQ==",
|
||||
"funding": [
|
||||
{
|
||||
"type": "github",
|
||||
"url": "https://github.com/sponsors/twbs"
|
||||
},
|
||||
{
|
||||
"type": "opencollective",
|
||||
"url": "https://opencollective.com/bootstrap"
|
||||
}
|
||||
],
|
||||
"peerDependencies": {
|
||||
"@popperjs/core": "^2.11.6"
|
||||
}
|
||||
},
|
||||
"node_modules/brace-expansion": {
|
||||
"version": "1.1.11",
|
||||
"resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
|
||||
@@ -5772,6 +5881,11 @@
|
||||
"resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.2.tgz",
|
||||
"integrity": "sha512-cOU9usZw8/dXIXKtwa8pM0OTJQuJkxMN6w30csNRUerHfeQ5R6U3kkU/FtJeIf3M202OHfY2U8ccInBG7/xogA=="
|
||||
},
|
||||
"node_modules/classnames": {
|
||||
"version": "2.3.2",
|
||||
"resolved": "https://registry.npmjs.org/classnames/-/classnames-2.3.2.tgz",
|
||||
"integrity": "sha512-CSbhY4cFEJRe6/GQzIk5qXZ4Jeg5pcsP7b5peFSDpffpe1cqjASH/n9UTjBwOp6XpMSTwQ8Za2K5V02ueA7Tmw=="
|
||||
},
|
||||
"node_modules/clean-css": {
|
||||
"version": "5.3.2",
|
||||
"resolved": "https://registry.npmjs.org/clean-css/-/clean-css-5.3.2.tgz",
|
||||
@@ -6592,6 +6706,14 @@
|
||||
"node": ">= 0.8"
|
||||
}
|
||||
},
|
||||
"node_modules/dequal": {
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/dequal/-/dequal-2.0.3.tgz",
|
||||
"integrity": "sha512-0je+qPKHEMohvfRTCEo3CrPG6cAzAYgmzKyxRiYSSDkS6eGJdyVJm7WaYA5ECaAD9wLB2T4EEeymA5aFVcYXCA==",
|
||||
"engines": {
|
||||
"node": ">=6"
|
||||
}
|
||||
},
|
||||
"node_modules/destroy": {
|
||||
"version": "1.2.0",
|
||||
"resolved": "https://registry.npmjs.org/destroy/-/destroy-1.2.0.tgz",
|
||||
@@ -6712,6 +6834,15 @@
|
||||
"utila": "~0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/dom-helpers": {
|
||||
"version": "5.2.1",
|
||||
"resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz",
|
||||
"integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.8.7",
|
||||
"csstype": "^3.0.2"
|
||||
}
|
||||
},
|
||||
"node_modules/dom-serializer": {
|
||||
"version": "1.4.1",
|
||||
"resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-1.4.1.tgz",
|
||||
@@ -9095,6 +9226,14 @@
|
||||
"node": ">= 0.4"
|
||||
}
|
||||
},
|
||||
"node_modules/invariant": {
|
||||
"version": "2.2.4",
|
||||
"resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
|
||||
"integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
|
||||
"dependencies": {
|
||||
"loose-envify": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/ipaddr.js": {
|
||||
"version": "2.0.1",
|
||||
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.0.1.tgz",
|
||||
@@ -14068,6 +14207,23 @@
|
||||
"react-is": "^16.13.1"
|
||||
}
|
||||
},
|
||||
"node_modules/prop-types-extra": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/prop-types-extra/-/prop-types-extra-1.1.1.tgz",
|
||||
"integrity": "sha512-59+AHNnHYCdiC+vMwY52WmvP5dM3QLeoumYuEyceQDi9aEhtwN9zIQ2ZNo25sMyXnbh32h+P1ezDsUpUH3JAew==",
|
||||
"dependencies": {
|
||||
"react-is": "^16.3.2",
|
||||
"warning": "^4.0.0"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": ">=0.14.0"
|
||||
}
|
||||
},
|
||||
"node_modules/prop-types-extra/node_modules/react-is": {
|
||||
"version": "16.13.1",
|
||||
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
|
||||
"integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ=="
|
||||
},
|
||||
"node_modules/prop-types/node_modules/react-is": {
|
||||
"version": "16.13.1",
|
||||
"resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz",
|
||||
@@ -14242,6 +14398,35 @@
|
||||
"node": ">=14"
|
||||
}
|
||||
},
|
||||
"node_modules/react-bootstrap": {
|
||||
"version": "2.7.4",
|
||||
"resolved": "https://registry.npmjs.org/react-bootstrap/-/react-bootstrap-2.7.4.tgz",
|
||||
"integrity": "sha512-EPKPwhfbxsKsNBhJBitJwqul9fvmlYWSft6jWE2EpqhEyjhqIqNihvQo2onE5XtS+QHOavUSNmA+8Lnv5YeAyg==",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.21.0",
|
||||
"@restart/hooks": "^0.4.9",
|
||||
"@restart/ui": "^1.6.3",
|
||||
"@types/react-transition-group": "^4.4.5",
|
||||
"classnames": "^2.3.2",
|
||||
"dom-helpers": "^5.2.1",
|
||||
"invariant": "^2.2.4",
|
||||
"prop-types": "^15.8.1",
|
||||
"prop-types-extra": "^1.1.0",
|
||||
"react-transition-group": "^4.4.5",
|
||||
"uncontrollable": "^7.2.1",
|
||||
"warning": "^4.0.3"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@types/react": ">=16.14.8",
|
||||
"react": ">=16.14.0",
|
||||
"react-dom": ">=16.14.0"
|
||||
},
|
||||
"peerDependenciesMeta": {
|
||||
"@types/react": {
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/react-dev-utils": {
|
||||
"version": "12.0.1",
|
||||
"resolved": "https://registry.npmjs.org/react-dev-utils/-/react-dev-utils-12.0.1.tgz",
|
||||
@@ -14381,6 +14566,11 @@
|
||||
"resolved": "https://registry.npmjs.org/react-is/-/react-is-17.0.2.tgz",
|
||||
"integrity": "sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w=="
|
||||
},
|
||||
"node_modules/react-lifecycles-compat": {
|
||||
"version": "3.0.4",
|
||||
"resolved": "https://registry.npmjs.org/react-lifecycles-compat/-/react-lifecycles-compat-3.0.4.tgz",
|
||||
"integrity": "sha512-fBASbA6LnOU9dOU2eW7aQ8xmYBSXUIWr+UmF9b1efZBazGNO+rcXT/icdKnYm2pTwcRylVUYwW7H1PHfLekVzA=="
|
||||
},
|
||||
"node_modules/react-refresh": {
|
||||
"version": "0.11.0",
|
||||
"resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.11.0.tgz",
|
||||
@@ -14389,6 +14579,36 @@
|
||||
"node": ">=0.10.0"
|
||||
}
|
||||
},
|
||||
"node_modules/react-router": {
|
||||
"version": "6.11.2",
|
||||
"resolved": "https://registry.npmjs.org/react-router/-/react-router-6.11.2.tgz",
|
||||
"integrity": "sha512-74z9xUSaSX07t3LM+pS6Un0T55ibUE/79CzfZpy5wsPDZaea1F8QkrsiyRnA2YQ7LwE/umaydzXZV80iDCPkMg==",
|
||||
"dependencies": {
|
||||
"@remix-run/router": "1.6.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": ">=16.8"
|
||||
}
|
||||
},
|
||||
"node_modules/react-router-dom": {
|
||||
"version": "6.11.2",
|
||||
"resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.11.2.tgz",
|
||||
"integrity": "sha512-JNbKtAeh1VSJQnH6RvBDNhxNwemRj7KxCzc5jb7zvDSKRnPWIFj9pO+eXqjM69gQJ0r46hSz1x4l9y0651DKWw==",
|
||||
"dependencies": {
|
||||
"@remix-run/router": "1.6.2",
|
||||
"react-router": "6.11.2"
|
||||
},
|
||||
"engines": {
|
||||
"node": ">=14"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": ">=16.8",
|
||||
"react-dom": ">=16.8"
|
||||
}
|
||||
},
|
||||
"node_modules/react-scripts": {
|
||||
"version": "5.0.1",
|
||||
"resolved": "https://registry.npmjs.org/react-scripts/-/react-scripts-5.0.1.tgz",
|
||||
@@ -14461,6 +14681,21 @@
|
||||
}
|
||||
}
|
||||
},
|
||||
"node_modules/react-transition-group": {
|
||||
"version": "4.4.5",
|
||||
"resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz",
|
||||
"integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.5.5",
|
||||
"dom-helpers": "^5.0.1",
|
||||
"loose-envify": "^1.4.0",
|
||||
"prop-types": "^15.6.2"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": ">=16.6.0",
|
||||
"react-dom": ">=16.6.0"
|
||||
}
|
||||
},
|
||||
"node_modules/read-cache": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/read-cache/-/read-cache-1.0.0.tgz",
|
||||
@@ -16209,6 +16444,20 @@
|
||||
"url": "https://github.com/sponsors/ljharb"
|
||||
}
|
||||
},
|
||||
"node_modules/uncontrollable": {
|
||||
"version": "7.2.1",
|
||||
"resolved": "https://registry.npmjs.org/uncontrollable/-/uncontrollable-7.2.1.tgz",
|
||||
"integrity": "sha512-svtcfoTADIB0nT9nltgjujTi7BzVmwjZClOmskKu/E8FW9BXzg9os8OLr4f8Dlnk0rYWJIWr4wv9eKUXiQvQwQ==",
|
||||
"dependencies": {
|
||||
"@babel/runtime": "^7.6.3",
|
||||
"@types/react": ">=16.9.11",
|
||||
"invariant": "^2.2.4",
|
||||
"react-lifecycles-compat": "^3.0.4"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"react": ">=15.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/unicode-canonical-property-names-ecmascript": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-2.0.0.tgz",
|
||||
@@ -16421,6 +16670,14 @@
|
||||
"makeerror": "1.0.12"
|
||||
}
|
||||
},
|
||||
"node_modules/warning": {
|
||||
"version": "4.0.3",
|
||||
"resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz",
|
||||
"integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==",
|
||||
"dependencies": {
|
||||
"loose-envify": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"node_modules/watchpack": {
|
||||
"version": "2.4.0",
|
||||
"resolved": "https://registry.npmjs.org/watchpack/-/watchpack-2.4.0.tgz",
|
||||
|
||||
@@ -7,8 +7,11 @@
|
||||
"@testing-library/react": "^13.4.0",
|
||||
"@testing-library/user-event": "^13.5.0",
|
||||
"axios": "^1.4.0",
|
||||
"bootstrap": "^5.2.3",
|
||||
"react": "^18.2.0",
|
||||
"react-bootstrap": "^2.7.4",
|
||||
"react-dom": "^18.2.0",
|
||||
"react-router-dom": "^6.11.2",
|
||||
"react-scripts": "5.0.1",
|
||||
"web-vitals": "^2.1.4"
|
||||
},
|
||||
|
||||
@@ -6,17 +6,19 @@ import SearchPage from './Pages/Searchpage'
|
||||
import LibPage from './Pages/Librarypage'
|
||||
import RegPage from './Pages/Regpage'
|
||||
import FilmInfo from './Pages/Filmpage'
|
||||
import Loginpage from './Pages/Loginpage';
|
||||
import { BrowserRouter as Router,Routes,Route} from 'react-router-dom';
|
||||
export default function App() {
|
||||
return (
|
||||
<div>
|
||||
<Router>
|
||||
<Routes>
|
||||
<Route path='/movie/:customerId' render={(props) => <MainPage/>} />
|
||||
<Route path='/genre:customerId' element={<SearchPage/>} />
|
||||
<Route path='/movie/:customerId' element={<MainPage/>} />
|
||||
<Route path='/genre/:customerId' element={<SearchPage/>} />
|
||||
<Route path='/library/:customerId' element={<LibPage/>} />
|
||||
<Route path='/customer' element={<RegPage/>} />
|
||||
<Route path='*' element={<RegPage/>} />
|
||||
<Route path='/movie/:customerId/:movieId' element={<FilmInfo/>} />
|
||||
<Route path='/login' element={<Loginpage/>} />
|
||||
</Routes>
|
||||
</Router>
|
||||
</div>
|
||||
|
||||
BIN
frontend/src/Assets/background.png
Normal file
BIN
frontend/src/Assets/background.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 24 KiB |
BIN
frontend/src/Assets/cover.png
Normal file
BIN
frontend/src/Assets/cover.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 176 KiB |
@@ -5,14 +5,13 @@ const host = "http://localhost:8080";
|
||||
|
||||
export async function registerUser(fullName,password)
|
||||
{
|
||||
|
||||
const response = await axios.post(`${host}/customer`, {
|
||||
fullName,
|
||||
password,
|
||||
});
|
||||
console.log(fullName);
|
||||
console.log(password);
|
||||
const response = await axios.post(`${host}/customer?fullName=${fullName}&password=${password}`);
|
||||
|
||||
if (response.status === 200) {
|
||||
const customerDTO = response.data;
|
||||
console.log(customerDTO);
|
||||
return customerDTO;}
|
||||
|
||||
}
|
||||
@@ -29,18 +28,22 @@ export async function getMovies()
|
||||
export async function getMovie(movieId)
|
||||
{
|
||||
const response = await axios.get(`${host}/movie/${movieId}`);
|
||||
|
||||
if (response.status === 200) {
|
||||
const movieDTO = response.data;
|
||||
return movieDTO;}
|
||||
}
|
||||
export async function getCustomerMovies(customerId)
|
||||
{
|
||||
const response = await axios.get(`${host}/movie/${customerId}`);
|
||||
const response = await axios.get(`${host}/customer/movies/${customerId}`);
|
||||
if (response.status === 200) {
|
||||
const customerMovies = response.data;
|
||||
return customerMovies;}
|
||||
}
|
||||
|
||||
export async function acquireMovie(movieId,customerId)
|
||||
{
|
||||
const response = await axios.get(`${host}/movie/${customerId}/${movieId}`);
|
||||
const response = await axios.post(`${host}/movie/${customerId}/${movieId}`);
|
||||
if (response.status === 200) {
|
||||
const movieDTO= response.data;
|
||||
return movieDTO;
|
||||
@@ -49,9 +52,56 @@ export async function acquireMovie(movieId,customerId)
|
||||
|
||||
export async function getMoviesByGenre(genre)
|
||||
{
|
||||
const response = await axios.get(`${host}/movie/${genre}`);
|
||||
console.log(genre);
|
||||
const response = await axios.get(`${host}/movie/movies/${genre}`);
|
||||
console.log(response.data);
|
||||
if (response.status === 200) {
|
||||
const moviesData= response.data;
|
||||
return moviesData;
|
||||
}
|
||||
}
|
||||
|
||||
export async function getCustomers()
|
||||
{
|
||||
const response = await axios.get(`${host}/customer`);
|
||||
if (response.status === 200) {
|
||||
const customers= response.data;
|
||||
console.log(customers);
|
||||
return customers;
|
||||
}
|
||||
}
|
||||
|
||||
export async function fillRepos()
|
||||
{
|
||||
console.log("here");
|
||||
const response1 = await axios.post(`${host}/genre/fill`);
|
||||
console.log(response1.data);
|
||||
if(response1.status === 200)
|
||||
{
|
||||
|
||||
const response2 = await axios.post(`${host}/movie/fill`);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
export async function getGenres()
|
||||
{
|
||||
const response = await axios.get(`${host}/genre`);
|
||||
if (response.status === 200) {
|
||||
const genres= response.data;
|
||||
console.log(genres);
|
||||
return genres;
|
||||
}
|
||||
}
|
||||
|
||||
export async function updateMovie(movieId, modalData)
|
||||
{
|
||||
console.log(movieId);
|
||||
console.log(modalData);
|
||||
const response = await axios.put(`${host}/movie/${movieId}?title=${modalData["title"]}&length=${modalData["length"]}&score=${modalData["score"]}`);
|
||||
}
|
||||
|
||||
export async function removeCustomerMovie(movieId,customerId)
|
||||
{
|
||||
const response = await axios.delete(`${host}/movie/${customerId}/${movieId}`);
|
||||
}
|
||||
@@ -1,20 +1,21 @@
|
||||
import React from 'react';
|
||||
import { Link, useParams } from 'react-router-dom';
|
||||
|
||||
function Film({customerId,movieId,title, acquire,main})
|
||||
function Film({customerId,movieId,title, acquire,main,search})
|
||||
{
|
||||
const handleAcquireClick = () => {
|
||||
acquire();
|
||||
};
|
||||
return (
|
||||
<div className="flex-containerB" style={{flexDirection: "column", display: "flex", width: "350px",height:"500px"}}>
|
||||
<div className="flex-item1" style={{flex: "10"}}>
|
||||
<img src="https://www.seekpng.com/png/detail/8-84931_question-mark-question-mark-white-background.png" alt = "cover" width="100%" height="420px"/>
|
||||
<div className="flex-containerB" style={{flexDirection: "column", display: "flex", width: "250px",height:"350px",gap:"40px",alignItems:"center"}}>
|
||||
<div className="flex-item1">
|
||||
<img src="https://www.seekpng.com/png/detail/8-84931_question-mark-question-mark-white-background.png" alt = "cover" width="100%" height="300px"/>
|
||||
</div>
|
||||
<div className="flex-item12 text-center" style={{flex: "1", color:"white",fontSize: " 32px",fontWeight: "bold"}}><Link to={`/movie/${customerId}/${movieId}`}>{title}</Link></div>
|
||||
<div className="flex-item12 text-center" style={{ color:"white",fontSize: " 32px",fontWeight: "bold"}}><Link style={{color: "white", textDecoration: "none"}} to={`/movie/${customerId}/${movieId}`}>{title}</Link></div>
|
||||
|
||||
{main ? (
|
||||
<button onClick={handleAcquireClick}>Add</button>
|
||||
) : (<div></div>)}
|
||||
<button style= {{width:"50px"}}onClick={handleAcquireClick}>Add</button>
|
||||
) : (main == null ? (<div></div>):(<button style= {{width:"90px"}}onClick={handleAcquireClick}>Remove</button>))}
|
||||
|
||||
</div>
|
||||
);
|
||||
|
||||
@@ -3,20 +3,23 @@ import { Link } from 'react-router-dom';
|
||||
|
||||
function Navbar({ customerId }) {
|
||||
return (
|
||||
<nav>
|
||||
<ul>
|
||||
<li>
|
||||
<Link to={`/movie/${customerId}`}>Main Page</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link to={`/genre/${customerId}`}>Search Page</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link to={`/library/${customerId}`}>Library Page</Link>
|
||||
</li>
|
||||
<li>
|
||||
<Link to="/customer">Registration Page</Link>
|
||||
<nav class="navbar navbar-expand-lg navbar-light">
|
||||
<ul class="navbar-nav mr-auto">
|
||||
<li class="nav-item active">
|
||||
<a class="nav-link"><Link style={{color: "white", textDecoration: "none"}} to={`/movie/${customerId}`}>Main Page</Link></a>
|
||||
</li>
|
||||
<li class="nav-item active">
|
||||
<a class="nav-link"><Link style={{color: "white", textDecoration: "none"}} to={`/genre/${customerId}`}>Search Page</Link></a>
|
||||
</li>
|
||||
<li class="nav-item active">
|
||||
<a class="nav-link"><Link style={{color: "white", textDecoration: "none"}} to={`/library/${customerId}`}>Library Page</Link></a>
|
||||
</li>
|
||||
<li class="nav-item active">
|
||||
<a class="nav-link"><Link style={{color: "white", textDecoration: "none"}} to="/customer">Registration Page</Link></a>
|
||||
</li>
|
||||
|
||||
|
||||
|
||||
</ul>
|
||||
</nav>
|
||||
);
|
||||
|
||||
@@ -1,22 +1,66 @@
|
||||
import React,{useEffect} from "react";
|
||||
import React,{useEffect,useState} from "react";
|
||||
import { useParams } from 'react-router-dom';
|
||||
import gradientImg from '../Assets/background.png';
|
||||
import Navbar from '../Components/Navbar';
|
||||
import Footer from '../Components/Footer';
|
||||
import { getMovie } from "../Components/DataService";
|
||||
import { Button, Modal } from "react-bootstrap";
|
||||
import { updateMovie } from "../Components/DataService";
|
||||
function Filmpage()
|
||||
{
|
||||
const { customerId, movieId } = useParams();
|
||||
const [movie, setMovie] = useState(null);
|
||||
const [showModal, setShowModal] = useState(false);
|
||||
const [modalData, setModalData] = useState({
|
||||
title: "",
|
||||
score: "",
|
||||
length: "",
|
||||
});
|
||||
|
||||
useEffect(() => {
|
||||
fetchMovie();
|
||||
}, []);
|
||||
|
||||
const fetchMovie = async () => {
|
||||
const movieData = await getMovie();
|
||||
const movieData = await getMovie(movieId);
|
||||
setMovie(movieData);
|
||||
};
|
||||
|
||||
const handleModalOpen = () => {
|
||||
setShowModal(true);
|
||||
};
|
||||
|
||||
const handleModalClose = () => {
|
||||
setShowModal(false);
|
||||
setModalData({
|
||||
title: "",
|
||||
score: "",
|
||||
length: "",
|
||||
});
|
||||
};
|
||||
|
||||
const handleModalInputChange = (event) => {
|
||||
const { name, value } = event.target;
|
||||
setModalData((prevData) => ({
|
||||
...prevData,
|
||||
[name]: value,
|
||||
}));
|
||||
};
|
||||
|
||||
const handleModalSubmit = async () => {
|
||||
|
||||
await updateMovie(movieId, modalData);
|
||||
|
||||
fetchMovie();
|
||||
|
||||
handleModalClose();
|
||||
|
||||
};
|
||||
|
||||
if (!movie) {
|
||||
return <p>Loading movie...</p>;
|
||||
}
|
||||
|
||||
return(
|
||||
<body>
|
||||
<div className="flex-container" style={{flexDirection:"column",display: "flex",backgroundImage: `url(${gradientImg})`}}>
|
||||
@@ -31,12 +75,36 @@ function Filmpage()
|
||||
<div className="flex-item1 text-light" style={{fontSize: "50px"}}><a>{movie.title}</a></div>
|
||||
<div className="flex-item3 text-light" style={{fontSize: "35px"}}>Average score: {movie.score}</div>
|
||||
<div className="flex-item3 text-light" style={{fontSize: "35px"}}>Length: {movie.length}</div>
|
||||
<div className="flex-item3 text-light" style={{fontSize: "35px"}}>Genre: {movie.genre}</div>
|
||||
<div className="flex-item3 text-light" style={{fontSize: "35px"}}>Genre: {movie.genreName}</div>
|
||||
<button className="primary" onClick={handleModalOpen}>Edit Movie</button>
|
||||
</div>
|
||||
</div>
|
||||
</main>
|
||||
</div>
|
||||
<Footer/>
|
||||
<Modal show={showModal} onHide={handleModalClose}>
|
||||
<Modal.Header closeButton>
|
||||
<Modal.Title>Edit Movie</Modal.Title>
|
||||
</Modal.Header>
|
||||
<Modal.Body>
|
||||
<div className="form-group">
|
||||
<label>Title:</label>
|
||||
<input type="text" className="form-control" name="title" value={modalData.title} onChange={handleModalInputChange} />
|
||||
</div>
|
||||
<div className="form-group">
|
||||
<label>Score:</label>
|
||||
<input type="text" className="form-control" name="score" value={modalData.score} onChange={handleModalInputChange} />
|
||||
</div>
|
||||
<div className="form-group">
|
||||
<label>Length:</label>
|
||||
<input type="text" className="form-control" name="length" value={modalData.length} onChange={handleModalInputChange} />
|
||||
</div>
|
||||
</Modal.Body>
|
||||
<Modal.Footer>
|
||||
<Button variant="secondary" onClick={handleModalClose}>Close</Button>
|
||||
<Button variant="primary" onClick={handleModalSubmit}>Save Changes</Button>
|
||||
</Modal.Footer>
|
||||
</Modal>
|
||||
</div>
|
||||
</body>
|
||||
)
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
import React,{useEffect} from "react";
|
||||
import React,{useEffect,useState} from "react";
|
||||
import gradientImg from '../Assets/background.png';
|
||||
import Footer from '../Components/Footer';
|
||||
import Navbar from '../Components/Navbar';
|
||||
import Film from "../Components/Film";
|
||||
import { useParams} from 'react-router-dom';
|
||||
import { getCustomerMovies } from "../Components/DataService";
|
||||
import { removeCustomerMovie } from "../Components/DataService";
|
||||
function Librarypage()
|
||||
{
|
||||
const [movies, setMovies] = useState([]);
|
||||
@@ -15,23 +17,27 @@ function Librarypage()
|
||||
|
||||
const fetchMovies = async () => {
|
||||
const moviesData = await getCustomerMovies(customerId);
|
||||
console.log(moviesData);
|
||||
setMovies(moviesData);
|
||||
};
|
||||
|
||||
|
||||
const handleDeleteMovie = async (movieId) => {
|
||||
await removeCustomerMovie(movieId,customerId);
|
||||
fetchMovies();
|
||||
}
|
||||
return(
|
||||
<body>
|
||||
<div className="flex-container" style={{flexDirection:"column",display: "flex",backgroundImage: `url(${gradientImg})`}}>
|
||||
<Navbar customerId={customerId}/>
|
||||
<div className="flex-container min-vh-100" style={{flexDirection: "column", display: "flex"}}>
|
||||
<main style={{display: "flex", flex: "1",flexWrap: "wrap", gap:"30px"}}>
|
||||
{movies.length > 0 ? (
|
||||
<div>
|
||||
<div style={{backgroundImage: `url(${gradientImg})`}}>
|
||||
<Navbar customerId={customerId}/>
|
||||
|
||||
<div className="flex-container min-vh-100" style={{display: "flex", marginLeft:"20px",marginTop:"50px"}}>
|
||||
|
||||
{movies.length > 0 ? (
|
||||
<div style={{flexDirection: "row", display:"flex",flexWrap: "wrap",gap:"30px"}}>
|
||||
{movies.map((movie) => (
|
||||
<Film key={movie.id}
|
||||
title={movie.title}
|
||||
acquire={() => handleAcquireMovie(movie.id)}
|
||||
title={movie.title}
|
||||
main={false}
|
||||
acquire={() => handleDeleteMovie(movie.id)}
|
||||
movieId = {movie.id}
|
||||
customerId={customerId}
|
||||
/>
|
||||
@@ -39,14 +45,17 @@ function Librarypage()
|
||||
))}
|
||||
</div>
|
||||
) : (
|
||||
<p>No movies available</p>
|
||||
<h1 style={{color:"white"}}>No movies available</h1>
|
||||
)}
|
||||
</main>
|
||||
</div>
|
||||
<Footer/>
|
||||
</div>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<Footer/>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
|
||||
|
||||
)
|
||||
}
|
||||
export default Librarypage;
|
||||
61
frontend/src/Pages/Loginpage.js
Normal file
61
frontend/src/Pages/Loginpage.js
Normal file
@@ -0,0 +1,61 @@
|
||||
import React, { useState, useEffect } from 'react';
|
||||
import { useNavigate } from 'react-router-dom';
|
||||
import gradientImg from '../Assets/background.png';
|
||||
import { getCustomers } from '../Components/DataService';
|
||||
import { fillRepos } from '../Components/DataService';
|
||||
function Loginpage() {
|
||||
|
||||
const [users, setUsers] = useState([]);
|
||||
const [selectedUser, setSelectedUser] = useState('');
|
||||
const navigate = useNavigate();
|
||||
|
||||
useEffect(() => {
|
||||
fetchUsers();
|
||||
}, []);
|
||||
|
||||
|
||||
const fetchUsers = async () => {
|
||||
fillRepos();
|
||||
const usersData = await getCustomers();
|
||||
setUsers(usersData);
|
||||
|
||||
}
|
||||
|
||||
const handleUserChange = (event) => {
|
||||
setSelectedUser(event.target.value);
|
||||
};
|
||||
|
||||
const handleLogin = () => {
|
||||
|
||||
if (selectedUser || users.length === 1) {
|
||||
const userId = selectedUser || users[0].id;
|
||||
navigate(`/movie/${userId}`);
|
||||
}
|
||||
};
|
||||
|
||||
return (
|
||||
|
||||
|
||||
<div className="flex-container" style={{flexDirection:"column",display: "flex",backgroundImage: `url(${gradientImg})`}}>
|
||||
<div className="flex-container min-vh-100" style={{flexDirection: "column", display: "flex", alignItems: "center", justifyContent: "center", gap: "20px"}}>
|
||||
<h1 htmlFor="userSelect" style={{color: "white"}}>Select User:</h1>
|
||||
<select id="userSelect" value={selectedUser} onChange={handleUserChange} style={{width: "100px"}}>
|
||||
{
|
||||
users.map((user) => (
|
||||
<option key={user.id} value={user.id}>
|
||||
{`${user.username}`}
|
||||
</option>
|
||||
))
|
||||
}
|
||||
</select>
|
||||
<button style={{marginTop: "50px"}}onClick={handleLogin}>Login</button>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
);
|
||||
}
|
||||
|
||||
export default Loginpage;
|
||||
@@ -16,6 +16,7 @@ function MainPage() {
|
||||
|
||||
const fetchMovies = async () => {
|
||||
const moviesData = await getMovies();
|
||||
console.log(moviesData);
|
||||
setMovies(moviesData);
|
||||
};
|
||||
|
||||
@@ -29,19 +30,14 @@ function MainPage() {
|
||||
};
|
||||
|
||||
return (
|
||||
<body>
|
||||
<div className="flex-container" id = "cc" style={{flexDirection:"column",display: "flex",backgroundImage: `url(${gradientImg})`}}>
|
||||
|
||||
<div style={{backgroundImage: `url(${gradientImg})`}}>
|
||||
<Navbar customerId={customerId}/>
|
||||
|
||||
<div className="flex-container min-vh-100" style={{flexDirection: "column", display: "flex"}}>
|
||||
<main style={{display: "flex", flex: "1", gap:"100px"}}>
|
||||
<div className="flex-container" style={{display: "flex", flexDirection: "column", flex:"1"}}>
|
||||
<header className="flex-item" style={{display: "flex", height: "90px"}}>
|
||||
<aside></aside>
|
||||
</header>
|
||||
|
||||
<div className="flex-container min-vh-100" style={{flexDirection: "row", display: "flex", marginLeft:"20px",marginTop:"50px"}}>
|
||||
|
||||
{movies.length > 0 ? (
|
||||
<div>
|
||||
<div style={{flexDirection: "row", display:"flex",flexWrap: "wrap",justifyContent:"space-between"}}>
|
||||
{movies.map((movie) => (
|
||||
<Film key={movie.id}
|
||||
title={movie.title}
|
||||
@@ -54,15 +50,15 @@ function MainPage() {
|
||||
))}
|
||||
</div>
|
||||
) : (
|
||||
<p>No movies available</p>
|
||||
<h1 style={{color: "white"}}>No movies available</h1>
|
||||
)}
|
||||
</div>
|
||||
</main>
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
<Footer/>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
|
||||
);
|
||||
|
||||
|
||||
@@ -1,18 +1,16 @@
|
||||
import React,{useState} from 'react';
|
||||
import { useHistory } from 'react-router-dom';
|
||||
import { registerUser } from '../Components/DateService.js';
|
||||
import { useNavigate } from 'react-router-dom';
|
||||
import { registerUser } from '../Components/DataService.js';
|
||||
import gradientImg from '../Assets/background.png';
|
||||
import Header from '../Components/Header';
|
||||
import CoverImg from '../Assets/cover.png'
|
||||
import Footer from '../Components/Footer';
|
||||
import CoverImg from '../Assets/covers.jpg'
|
||||
import {addUser} from '../Components/DataService'
|
||||
function Regpage()
|
||||
{
|
||||
|
||||
const [inputUsername, setUsername] = useState('');
|
||||
const [inputPassword,setPassword] = useState('');
|
||||
|
||||
const history = useHistory();
|
||||
const navigate = useNavigate();
|
||||
|
||||
const handleInputChange = (e) => {
|
||||
const {id , value} = e.target;
|
||||
@@ -28,18 +26,17 @@ function Regpage()
|
||||
const handleSubmit = async (event) => {
|
||||
event.preventDefault();
|
||||
|
||||
const customerDTO = await registerUser(fullName, password);
|
||||
const customerDTO = await registerUser(inputUsername, inputPassword);
|
||||
setUsername ('');
|
||||
setPassword ('');
|
||||
navigate(`/login`);
|
||||
|
||||
history.push(`/movie/${customerDTO.id}`);
|
||||
|
||||
setUsername = '';
|
||||
setPassword = '';
|
||||
|
||||
}
|
||||
|
||||
return(
|
||||
<body>
|
||||
<div className="flex-container" style={{flexDirection:"column",display: "flex",backgroundImage: `url(${gradientImg})`}}>
|
||||
<Header/>
|
||||
|
||||
<div className="flex-container" style={{flexDirection:"column",display: "flex",backgroundImage: `url(${gradientImg})`}}>
|
||||
<div className="flex-container min-vh-100" style={{flexDirection: "column", display: "flex"}}>
|
||||
<main style={{display: "flex", flex: "1"}}>
|
||||
<aside className="flex-item2" style={{flex: "2"}}></aside>
|
||||
@@ -59,7 +56,8 @@ function Regpage()
|
||||
<section className="flex-itemR7" style={{display: "flex", width: "320px", paddingLeft: "30px"}}>
|
||||
<input className="form-control" id="inputPassword" type="password" value={inputPassword} onChange = {(e) => handleInputChange(e)} placeholder="Enter password"/>
|
||||
</section>
|
||||
<button className="btn btn-primary" type="button" id="register" style={{fontSize: "20px", marginLeft: "30px", marginTop: "15px", width: "150px", backgroundColor: "#320D3E", color:"white", fontWeight: "bold"}} onClick={()=>{handleSubmit();addUser(inputUsername,inputPassword);}} >Register</button>
|
||||
<button className="btn btn-primary" type="submit" id="register" style={{fontSize: "20px", marginLeft: "30px", marginTop: "15px", width: "150px", backgroundColor: "#320D3E", color:"white", fontWeight: "bold"}} onClick={(e)=>handleSubmit(e)} >Register</button>
|
||||
<a href="/login">Sign in</a>
|
||||
</form>
|
||||
</section>
|
||||
<aside className="flex-item5" style={{flex: "2"}}></aside>
|
||||
@@ -67,7 +65,7 @@ function Regpage()
|
||||
</div>
|
||||
<Footer/>
|
||||
</div>
|
||||
</body>
|
||||
|
||||
)
|
||||
}
|
||||
export default Regpage;
|
||||
@@ -1,73 +1,84 @@
|
||||
import React,{useState} from "react";
|
||||
import React,{useState,useEffect} from "react";
|
||||
import gradientImg from '../Assets/background.png'
|
||||
import Navbar from '../Components/Navbar';
|
||||
import Footer from '../Components/Footer'
|
||||
import Film from '../Components/Film';
|
||||
|
||||
import { getMoviesByGenre } from "../Components/DataService";
|
||||
import { useParams } from 'react-router-dom';
|
||||
|
||||
import { getGenres } from "../Components/DataService";
|
||||
function Searchpage()
|
||||
{
|
||||
|
||||
const { customerId } = useParams();
|
||||
const [genre, setGenre] = useState('');
|
||||
const [genres, setGenres] = useState([]);
|
||||
const [movies, setMovies] = useState([]);
|
||||
const [selectedGenre, setSelectedGenre] = useState('');
|
||||
const [loading, setLoading] = useState(false);
|
||||
|
||||
useEffect(() => {
|
||||
fetchGenres();
|
||||
}, []);
|
||||
|
||||
const fetchGenres = async() =>{
|
||||
const response = await getGenres();
|
||||
setGenres(response);
|
||||
}
|
||||
|
||||
const handleGenreChange = (event) => {
|
||||
setGenre(event.target.value);
|
||||
setSelectedGenre(event.target.value);
|
||||
};
|
||||
|
||||
const handleSearch = async () => {
|
||||
setLoading(true);
|
||||
|
||||
const response = await getMoviesByGenre(genre);
|
||||
const response = await getMoviesByGenre(selectedGenre);
|
||||
setLoading(false);
|
||||
setMovies(response);
|
||||
}
|
||||
return (
|
||||
<>
|
||||
<body>
|
||||
<div className="flex-container" style={{flexDirection:"column",display: "flex",backgroundImage: `url(${gradientImg})`}}>
|
||||
<Navbar customerId={customerId}/>
|
||||
<div className="flex-container min-vh-100" style={{flexDirection: "column", display: "flex"}}>
|
||||
<main style={{display: "flex", flex: "1", gap:"100px"}}>
|
||||
<div>
|
||||
<input
|
||||
type="text"
|
||||
placeholder="Enter genre"
|
||||
value={genre}
|
||||
onChange={handleGenreChange}
|
||||
/>
|
||||
<button onClick={handleSearch}>Search</button>
|
||||
</div>
|
||||
{loading ? (
|
||||
<p>Loading movies...</p>
|
||||
) : (
|
||||
<div>
|
||||
{movies.length > 0 ? (
|
||||
<div>
|
||||
{movies.map((movie) => (
|
||||
<Film key={movie.id}
|
||||
title={movie.title}
|
||||
acquire={() => handleAcquireMovie(movie.id)}
|
||||
main = {true}
|
||||
movieId = {movie.id}
|
||||
customerId={customerId}
|
||||
/>
|
||||
|
||||
))}
|
||||
</div>
|
||||
) : (
|
||||
<p>No movies found</p>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
</main>
|
||||
</div>
|
||||
<Footer/>
|
||||
</div>
|
||||
</body>
|
||||
</>
|
||||
|
||||
|
||||
<div className="flex-container" style={{ flexDirection: "column", display: "flex", backgroundImage: `url(${gradientImg})` }}>
|
||||
<Navbar customerId={customerId} />
|
||||
|
||||
<div className="flex-container min-vh-100" style={{ flexDirection: "column", display: "flex", flex: "1", alignItems: "center", justifyContent: "flex-start", marginTop: "20px" }}>
|
||||
<div>
|
||||
<select id="genre-select" value={selectedGenre} onChange={handleGenreChange}>
|
||||
<option value="all">All Genres</option>
|
||||
{genres.map((genre) => (
|
||||
<option key={genre.id} value={genre.name}>
|
||||
{genre.name}
|
||||
</option>
|
||||
))}
|
||||
</select>
|
||||
<button type="button" onClick={handleSearch}>Search</button>
|
||||
</div>
|
||||
<div className="flex-container min-vh-100" style={{flexDirection: "row", display: "flex", marginLeft:"20px",marginTop:"50px"}}>
|
||||
{loading ? (
|
||||
<p>Loading movies...</p>
|
||||
) : (
|
||||
<div style={{flexDirection: "row", display:"flex",flexWrap: "wrap",gap:"30px"}}>
|
||||
{movies.length > 0 ? (
|
||||
movies.map((movie) => (
|
||||
<Film
|
||||
key={movie.id}
|
||||
title={movie.title}
|
||||
movieId={movie.id}
|
||||
customerId={customerId}
|
||||
/>
|
||||
))
|
||||
) : (
|
||||
<h1 style={{color:"white"}}>No movies found</h1>
|
||||
)}
|
||||
</div>
|
||||
)}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<Footer/>
|
||||
</div>
|
||||
|
||||
|
||||
|
||||
);
|
||||
}
|
||||
|
||||
@@ -4,6 +4,8 @@ import './index.css';
|
||||
import App from './App';
|
||||
import reportWebVitals from './reportWebVitals';
|
||||
|
||||
|
||||
|
||||
const root = ReactDOM.createRoot(document.getElementById('root'));
|
||||
root.render(
|
||||
<App />
|
||||
|
||||
@@ -2,6 +2,7 @@ package ru.ulstu.is.sbapp.Customer.Controller;
|
||||
|
||||
import org.springframework.web.bind.annotation.*;
|
||||
import ru.ulstu.is.sbapp.Customer.Service.CustomerService;
|
||||
import ru.ulstu.is.sbapp.Movie.Controller.MovieDTO;
|
||||
|
||||
import java.util.List;
|
||||
|
||||
@@ -39,4 +40,11 @@ public class CustomerController {
|
||||
public CustomerDTO deleteCustomer(@PathVariable Long id) {
|
||||
return new CustomerDTO(customerService.deleteCustomer(id));
|
||||
}
|
||||
|
||||
@GetMapping("/movies/{customerId}")
|
||||
public List<MovieDTO> getCustomerMovies(@PathVariable("customerId") Long customerId) {
|
||||
return customerService.findCustomerMovies(customerId).stream()
|
||||
.map(MovieDTO::new)
|
||||
.toList();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,16 +7,12 @@ import java.util.List;
|
||||
|
||||
public class CustomerDTO {
|
||||
private final long id;
|
||||
private final String first_name;
|
||||
private final String middle_name;
|
||||
private final String last_name;
|
||||
private final String username;
|
||||
private final String password;
|
||||
private final List<MovieDTO> movies;
|
||||
public CustomerDTO(Customer customer) {
|
||||
this.id = customer.getId();
|
||||
this.first_name = customer.getFirst_name();
|
||||
this.middle_name = customer.getMiddle_name();
|
||||
this.last_name = customer.getLast_name();
|
||||
this.username = customer.getUsername();
|
||||
this.password = customer.getPassword();
|
||||
this.movies = customer.getMovies().stream().map(MovieDTO::new).toList();
|
||||
}
|
||||
@@ -25,16 +21,8 @@ public class CustomerDTO {
|
||||
return id;
|
||||
}
|
||||
|
||||
public String getFirst_name() {
|
||||
return first_name;
|
||||
}
|
||||
|
||||
public String getLast_name() {
|
||||
return last_name;
|
||||
}
|
||||
|
||||
public String getMiddle_name() {
|
||||
return middle_name;
|
||||
public String getUsername() {
|
||||
return username;
|
||||
}
|
||||
|
||||
public String getPassword() {
|
||||
|
||||
@@ -16,17 +16,12 @@ public class Customer
|
||||
@GeneratedValue(strategy = GenerationType.AUTO)
|
||||
private Long id;
|
||||
@Column
|
||||
@NotBlank(message = "Firstname can't be null or empty")
|
||||
private String first_name;
|
||||
@Column
|
||||
@NotBlank(message = "Lastname can't be null or empty")
|
||||
private String last_name;
|
||||
@Column
|
||||
private String middle_name;
|
||||
@NotBlank(message = "Username can't be null or empty")
|
||||
private String username;
|
||||
@Column
|
||||
@NotBlank(message = "Password can't be empty")
|
||||
private String password;
|
||||
@OneToMany(fetch = FetchType.EAGER, mappedBy = "customer", cascade = CascadeType.ALL)
|
||||
@OneToMany(fetch = FetchType.EAGER, cascade = CascadeType.ALL)
|
||||
private List<Movie> movies;
|
||||
|
||||
|
||||
@@ -34,16 +29,11 @@ public class Customer
|
||||
{
|
||||
|
||||
}
|
||||
public Customer(String fullName,String password)
|
||||
public Customer(String username,String password)
|
||||
{
|
||||
String[] partsName = fullName.split(" ");
|
||||
this.first_name = partsName[0];
|
||||
this.last_name = partsName[1];
|
||||
this.username = username;
|
||||
this.password = password;
|
||||
if(partsName.length == 3)
|
||||
{
|
||||
this.middle_name = partsName[2];
|
||||
}
|
||||
|
||||
this.movies = new ArrayList<>();
|
||||
}
|
||||
|
||||
@@ -53,41 +43,14 @@ public class Customer
|
||||
}
|
||||
public String getPassword() {return password;}
|
||||
|
||||
public String getFirst_name()
|
||||
public String getUsername()
|
||||
{
|
||||
return first_name;
|
||||
return username;
|
||||
}
|
||||
|
||||
public void setFirst_name(String fullName)
|
||||
public void setUsername(String username)
|
||||
{
|
||||
String[] partsName = fullName.split(" ");
|
||||
this.first_name = partsName[0];
|
||||
}
|
||||
|
||||
public String getLast_name()
|
||||
{
|
||||
return last_name;
|
||||
}
|
||||
|
||||
public void setLast_name(String fullName)
|
||||
{
|
||||
String[] partsName = fullName.split(" ");
|
||||
this.last_name = partsName[1];
|
||||
}
|
||||
|
||||
public String getMiddle_name()
|
||||
{
|
||||
|
||||
return middle_name.isBlank() ? null : middle_name;
|
||||
}
|
||||
|
||||
public void setMiddle_name(String fullName)
|
||||
{
|
||||
String[] partsName = fullName.split(" ");
|
||||
if(partsName.length == 3)
|
||||
{
|
||||
this.middle_name = partsName[2];
|
||||
}
|
||||
this.username = username;
|
||||
}
|
||||
|
||||
public List<Movie> getMovies()
|
||||
@@ -106,6 +69,6 @@ public class Customer
|
||||
@Override
|
||||
public String toString()
|
||||
{
|
||||
return "Customer: " + "ID: " + id + " | FirstName: " + first_name + " | LastName: " + last_name + " | MiddleName: " + middle_name;
|
||||
return "Customer: " + "ID: " + id + " | Username: " + username;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -6,6 +6,7 @@ import org.springframework.util.StringUtils;
|
||||
import ru.ulstu.is.sbapp.Customer.Exception.CustomerNotFoundException;
|
||||
import ru.ulstu.is.sbapp.Customer.Model.Customer;
|
||||
import ru.ulstu.is.sbapp.Customer.Repository.CustomerRepository;
|
||||
import ru.ulstu.is.sbapp.Movie.Model.Movie;
|
||||
import ru.ulstu.is.sbapp.Utilities.validation.ValidatorUtil;
|
||||
import javax.persistence.EntityNotFoundException;
|
||||
|
||||
@@ -67,9 +68,7 @@ public class CustomerService
|
||||
throw new CustomerNotFoundException(id);
|
||||
}
|
||||
final Customer specificCustomer = customer.get();
|
||||
specificCustomer.setFirst_name(fullName);
|
||||
specificCustomer.setLast_name(fullName);
|
||||
specificCustomer.setMiddle_name(fullName);
|
||||
specificCustomer.setUsername(fullName);
|
||||
|
||||
validatorUtil.validate(specificCustomer);
|
||||
|
||||
@@ -95,4 +94,11 @@ public class CustomerService
|
||||
{
|
||||
customerRepository.deleteAll();
|
||||
}
|
||||
|
||||
@Transactional(readOnly = true)
|
||||
public List<Movie> findCustomerMovies(Long customerId){
|
||||
|
||||
final Optional<Customer> customer = customerRepository.findById(customerId);
|
||||
return customer.get().getMovies();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -39,4 +39,7 @@ public class GenreContoller {
|
||||
public GenreDTO deleteGenre(@PathVariable Long id) {
|
||||
return new GenreDTO(genreService.deleteGenre(id));
|
||||
}
|
||||
|
||||
@PostMapping("/fill")
|
||||
public boolean insertGenres() { return genreService.fillRepo();}
|
||||
}
|
||||
|
||||
@@ -11,6 +11,5 @@ import java.util.Optional;
|
||||
|
||||
public interface GenreRepository extends JpaRepository<Genre,Long> {
|
||||
|
||||
@Query("SELECT g FROM Genre g WHERE g.name LIKE genre")
|
||||
Optional<Genre> findByName(@Param("genre")String genreName);
|
||||
Optional<Genre> findByNameLike(String genreName);
|
||||
}
|
||||
|
||||
@@ -47,7 +47,7 @@ public class GenreService
|
||||
@Transactional(readOnly = true)
|
||||
public Genre findGenreByName(String name)
|
||||
{
|
||||
final Optional<Genre> genre = genreRepository.findByName(name);
|
||||
final Optional<Genre> genre = genreRepository.findByNameLike(name);
|
||||
return genre.orElseThrow(() -> new GenreNotFoundException(name));
|
||||
}
|
||||
|
||||
@@ -95,4 +95,26 @@ public class GenreService
|
||||
public void deleteAllGenres() {
|
||||
genreRepository.deleteAll();
|
||||
}
|
||||
|
||||
public boolean fillRepo()
|
||||
{
|
||||
if(genreRepository.count() != 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
Genre genreSciFi = addGenre("Sci-Fi");
|
||||
|
||||
Genre genreAdventure = addGenre("Adventure");
|
||||
|
||||
|
||||
Genre genreAction = addGenre("Action");
|
||||
|
||||
|
||||
Genre genreComedy = addGenre("Comedy");
|
||||
|
||||
return true;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -25,19 +25,14 @@ public class MovieController {
|
||||
.toList();
|
||||
}
|
||||
|
||||
@GetMapping("/{customerId}")
|
||||
public List<MovieDTO> getCustomerMovies(@PathVariable("customerId") Long customerId) {
|
||||
return movieService.findCustomerMovies(customerId).stream()
|
||||
|
||||
@GetMapping("/movies/{genre}")
|
||||
public List<MovieDTO> getSpecificMovies(@PathVariable("genre") String genre) {
|
||||
return movieService.findAllSpecificMovies(genre).stream()
|
||||
.map(MovieDTO::new)
|
||||
.toList();
|
||||
}
|
||||
|
||||
@GetMapping("/{genre}")
|
||||
public List<MovieDTO> getSpecificMovies(@PathVariable("genre") String genreName) {
|
||||
return movieService.findAllSpecificMovies(genreName).stream()
|
||||
.map(MovieDTO::new)
|
||||
.toList();
|
||||
}
|
||||
@PostMapping
|
||||
public MovieDTO createMovie(@RequestParam("title") String title, @RequestParam("length") int length, @RequestParam("score") double score, @RequestParam("genre") Long genreId) {
|
||||
return new MovieDTO(movieService.addMovie(title,length,score,genreId));
|
||||
@@ -64,4 +59,10 @@ public class MovieController {
|
||||
public MovieDTO deleteMovieCustomer(@PathVariable("customerId") Long customerId,@PathVariable("id") Long id) {
|
||||
return new MovieDTO(movieService.deleteMovieCustomer(id,customerId));
|
||||
}
|
||||
|
||||
@PostMapping("/fill")
|
||||
public boolean insertMovies()
|
||||
{
|
||||
return movieService.fillRepo();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,14 +11,14 @@ public class MovieDTO {
|
||||
private final String title;
|
||||
private final int length;
|
||||
private final double score;
|
||||
private final Genre genre;
|
||||
private final String genreName;
|
||||
|
||||
public MovieDTO(Movie movie) {
|
||||
this.id = movie.getId();
|
||||
this.title = movie.getTitle();
|
||||
this.length = movie.getLength();
|
||||
this.score = movie.getScore();
|
||||
this.genre = movie.getGenre();
|
||||
this.genreName = movie.getGenre().getName();
|
||||
}
|
||||
public long getID() {
|
||||
return id;
|
||||
@@ -32,7 +32,5 @@ public class MovieDTO {
|
||||
public double getScore() {
|
||||
return score;
|
||||
}
|
||||
public Genre getGenre() {
|
||||
return genre;
|
||||
}
|
||||
public String getGenreName() {return genreName;}
|
||||
}
|
||||
|
||||
@@ -9,6 +9,6 @@ import ru.ulstu.is.sbapp.Movie.Model.Movie;
|
||||
import java.util.List;
|
||||
|
||||
public interface MovieRepository extends JpaRepository<Movie,Long> {
|
||||
@Query("SELECT m FROM Movie m WHERE :specGenre LIKE m.genre")
|
||||
@Query("SELECT m FROM Movie m WHERE m.genre = :specGenre")
|
||||
List<Movie> findByGenre(@Param("specGenre") Genre genre);
|
||||
}
|
||||
|
||||
@@ -91,12 +91,6 @@ public class MovieService
|
||||
return movieRepository.findAll();
|
||||
}
|
||||
|
||||
@Transactional(readOnly = true)
|
||||
public List<Movie> findCustomerMovies(Long customerId){
|
||||
|
||||
final Optional<Customer> customer = customerRepository.findById(customerId);
|
||||
return customer.get().getMovies();
|
||||
}
|
||||
|
||||
@Transactional
|
||||
public Movie updateMovie(Long id, String title, int length, double score)
|
||||
@@ -152,7 +146,6 @@ public class MovieService
|
||||
|
||||
customer.get().getMovies().remove(specificMovie);
|
||||
|
||||
movieRepository.delete(specificMovie);
|
||||
|
||||
return specificMovie;
|
||||
}
|
||||
@@ -181,7 +174,7 @@ public class MovieService
|
||||
@Transactional
|
||||
public List<Movie> findAllSpecificMovies(String genreName)
|
||||
{
|
||||
return movieRepository.findByGenre(genreRepository.findByName(genreName).get());
|
||||
return movieRepository.findByGenre(genreRepository.findByNameLike(genreName).get());
|
||||
}
|
||||
|
||||
@Transactional
|
||||
@@ -189,4 +182,33 @@ public class MovieService
|
||||
{
|
||||
movieRepository.deleteAll();
|
||||
}
|
||||
|
||||
public boolean fillRepo()
|
||||
{
|
||||
if(movieRepository.count() != 0)
|
||||
{
|
||||
return false;
|
||||
}
|
||||
|
||||
Optional<Genre> genreSciFi = genreRepository.findByNameLike("Sci-Fi");
|
||||
Optional<Genre> genreAdventure = genreRepository.findByNameLike("Adventure");
|
||||
Optional<Genre> genreAction = genreRepository.findByNameLike("Action");
|
||||
Optional<Genre> genreComedy = genreRepository.findByNameLike("Comedy");
|
||||
|
||||
|
||||
|
||||
Movie interstellar = addMovie("Interstellar",12,4.5,genreSciFi.get().getId());
|
||||
Movie passengers = addMovie("Passengers",5,5.0,genreSciFi.get().getId());
|
||||
|
||||
Movie indianaJones = addMovie("Indiana Jones",9,4.3,genreAdventure.get().getId());
|
||||
Movie jumandji = addMovie("Djumandji",2,3.1,genreAdventure.get().getId());
|
||||
|
||||
Movie fastFurious = addMovie("Fast and Furious 2",4,4.1,genreAction.get().getId());
|
||||
Movie idk = addMovie("IDK",1,2.1,genreAction.get().getId());
|
||||
|
||||
Movie misterBean = addMovie("Mister bean in London",3,4.4,genreComedy.get().getId());
|
||||
Movie ted = addMovie("TED",5,5.0,genreComedy.get().getId());
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user