[DEV] refactor all (SSO + better bdd, no null ...)

This commit is contained in:
Edouard DUPIN 2022-06-03 00:28:30 +02:00
parent 593abab525
commit e421ead4ab
87 changed files with 1841 additions and 2052 deletions

2
.gitignore vendored
View File

@ -1,4 +1,6 @@
# See http://help.github.com/ignore-files/ for more about ignoring files.
out
.idea
# compiled output
/dist

79
Dockerfile Normal file
View File

@ -0,0 +1,79 @@
######################################################################################
##
## buyilding-end install applications:
##
######################################################################################
FROM archlinux:base-devel AS builder
# update system
RUN pacman -Syu --noconfirm && pacman-db-upgrade \
&& pacman -S --noconfirm jdk-openjdk maven npm \
&& pacman -Scc --noconfirm
ENV PATH /tmp/node_modules/.bin:$PATH
WORKDIR /tmp
######################################################################################
##
## Build back:
##
######################################################################################
FROM builder AS buildBack
COPY back/pom.xml /tmp
COPY back/src /tmp/src/
RUN mvn clean compile assembly:single
######################################################################################
##
## Build front:
##
######################################################################################
FROM builder AS buildFront
ADD front/package-lock.json \
front/package.json \
front/karma.conf.js \
front/protractor.conf.js \
/tmp/
# install and cache app dependencies
RUN npm install
ADD front/e2e \
front/tsconfig.json \
front/tslint.json \
front/angular.json \
/tmp/
ADD front/src /tmp/src
# generate build
RUN ng build --output-path=dist --configuration=production --base-href=/karideo/ --deploy-url=/karideo/
######################################################################################
##
## Production area:
##
######################################################################################
FROM bellsoft/liberica-openjdk-alpine:latest
# add wget to manage the health check...
RUN apk add --no-cache wget
#FROM archlinux:base
#RUN pacman -Syu --noconfirm && pacman-db-upgrade
## install package
#RUN pacman -S --noconfirm jdk-openjdk wget
## intall npm
#RUN pacman -S --noconfirm npm
## clean all the caches Need only on the release environment
#RUN pacman -Scc --noconfirm
ENV LANG=C.UTF-8
COPY --from=buildBack /tmp/out/maven/*.jar /application/application.jar
COPY --from=buildFront /tmp/dist /application/karideo/
WORKDIR /application/
EXPOSE 17080
CMD ["java", "-Xms64M", "-Xmx1G", "-cp", "/application/application.jar", "org.kar.karideo.WebLauncher"]

View File

@ -10,8 +10,8 @@
<istack.version>3.0.7</istack.version>
<maven.compiler.version>3.1</maven.compiler.version>
<maven.compiler.source>14</maven.compiler.source>
<maven.compiler.target>14</maven.compiler.target>
<maven.compiler.source>17</maven.compiler.source>
<maven.compiler.target>17</maven.compiler.target>
<maven.dependency.version>3.1.1</maven.dependency.version>
</properties>
@ -33,17 +33,14 @@
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-multipart</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.inject</groupId>
<artifactId>jersey-hk2</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>org.glassfish.jersey.containers</groupId>
<artifactId>jersey-container-grizzly2-http</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
@ -78,7 +75,6 @@
<dependency>
<groupId>org.glassfish.jersey.media</groupId>
<artifactId>jersey-media-json-jackson</artifactId>
<version>${jersey.version}</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
@ -97,6 +93,11 @@
<version>RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>com.nimbusds</groupId>
<artifactId>nimbus-jose-jwt</artifactId>
<version>9.22</version>
</dependency>
</dependencies>
<build>

View File

@ -2,7 +2,6 @@ package org.kar.karideo;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.kar.karideo.db.DBEntry;
import org.kar.karideo.model.State;
import org.kar.karideo.model.User;
import org.kar.karideo.model.UserSmall;
@ -39,103 +38,26 @@ public class UserDB {
return null;
}
@Deprecated
public static User getAndCreate(long userId, String token) throws IOException {
// check Token:
URL obj = new URL(WebLauncher.getOAuthURI() + "users/check_token?id=" + userId + "&token=" + token);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
con.setRequestProperty("User-Agent", "karideo");
con.setRequestProperty("Cache-Control", "no-cache");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
int responseCode = con.getResponseCode();
System.out.println("GET Response Code :: " + responseCode);
if (responseCode == HttpURLConnection.HTTP_OK) { // success
BufferedReader in = new BufferedReader(new InputStreamReader(
con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
// print result
System.out.println(response.toString());
ObjectMapper mapper = new ObjectMapper();
;
UserSmall value = mapper.readValue(response.toString(), UserSmall.class);
System.out.println("user SMALL " + value);
return null;
} else {
System.out.println("GET request not worked");
}
return null;
}
public static UserSmall getUserOAuth(long userId, String token) throws IOException {
// check Token:
URL obj = new URL(WebLauncher.getOAuthURI() + "users/check_token?id=" + userId + "&token=" + token);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
con.setRequestProperty("User-Agent", "karideo");
con.setRequestProperty("Cache-Control", "no-cache");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
int responseCode = con.getResponseCode();
System.out.println("GET Response Code :: " + responseCode);
if (responseCode == HttpURLConnection.HTTP_OK) { // success
BufferedReader in = new BufferedReader(new InputStreamReader(
con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
// print result
System.out.println(response.toString());
ObjectMapper mapper = new ObjectMapper();
;
return mapper.readValue(response.toString(), UserSmall.class);
}
System.out.println("GET request not worked");
return null;
}
public static User getUserOrCreate(UserSmall userOAuth) {
User user = getUsers(userOAuth.id);
public static User getUserOrCreate(long userId, String userLogin) {
User user = getUsers(userId);
if (user != null) {
/*
boolean blocked = false;
boolean removed = false;
if (userOAuth.authorisationLevel == State.BLOCKED) {
blocked = true;
} else if (userOAuth.authorisationLevel == State.REMOVED) {
removed = true;
}
if (user.email != userOAuth.email || user.login != userOAuth.login || user.blocked != blocked || user.removed != removed) {
updateUsersInfoFromOAuth(userOAuth.id, userOAuth.email, userOAuth.login, blocked, removed);
} else {
updateUsersConnectionTime(userOAuth.id);
}
return getUsers(userOAuth.id);
} else {
if (userOAuth.authorisationLevel == State.BLOCKED) {
return null;
} else if (userOAuth.authorisationLevel == State.REMOVED) {
return null;
*/
return user;
}
createUsersInfoFromOAuth(userOAuth.id, userOAuth.email, userOAuth.login);
createUsersInfoFromOAuth(userId, userLogin);
return getUsers(userId);
}
return getUsers(userOAuth.id);
}
/*
private static void updateUsersConnectionTime(long userId) {
DBEntry entry = new DBEntry(WebLauncher.dbConfig);
String query = "UPDATE `user` SET `lastConnection`=now(3) WHERE `id` = ?";
@ -165,15 +87,15 @@ public class UserDB {
}
entry.disconnect();
}
*/
private static void createUsersInfoFromOAuth(long userId, String email, String login) {
private static void createUsersInfoFromOAuth(long userId, String login) {
DBEntry entry = new DBEntry(WebLauncher.dbConfig);
String query = "INSERT INTO `user` (`id`, `login`, `email`, `lastConnection`, `admin`, `blocked`, `removed`) VALUE (?,?,?,now(3),'FALSE','FALSE','FALSE')";
String query = "INSERT INTO `user` (`id`, `login`, `lastConnection`, `admin`, `blocked`, `removed`) VALUE (?,?,now(3),'FALSE','FALSE','FALSE')";
try {
PreparedStatement ps = entry.connection.prepareStatement(query);
ps.setLong(1, userId);
ps.setString(2, login);
ps.setString(3, email);
ps.executeUpdate();
} catch (SQLException throwables) {
throwables.printStackTrace();

View File

@ -6,6 +6,11 @@ import org.glassfish.jersey.media.multipart.MultiPartFeature;
import org.glassfish.jersey.server.ResourceConfig;
import org.kar.karideo.api.*;
import org.kar.karideo.db.DBConfig;
import org.kar.karideo.filter.AuthenticationFilter;
import org.kar.karideo.filter.CORSFilter;
import org.kar.karideo.filter.OptionFilter;
import org.kar.karideo.util.ConfigVariable;
import org.kar.karideo.util.JWTWrapper;
import org.glassfish.jersey.jackson.JacksonFeature;
import javax.ws.rs.core.UriBuilder;
@ -25,12 +30,23 @@ public class WebLauncher {
return UriBuilder.fromUri(ConfigVariable.getlocalAddress()).build();
}
public static String getOAuthURI() {
return ConfigVariable.getRestOAuthServer();
}
public static void main(String[] args) {
ResourceConfig rc = new ResourceConfig();
// need to uppgrade when server call us...
try {
JWTWrapper.initLocalTokenRemote(ConfigVariable.getSSOAddress(), "karideo");
} catch (Exception e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
System.out.println("Wait 10 seconds ....");
try {
Thread.sleep(10000);
} catch (InterruptedException e) {
e.printStackTrace();
}
return;
}
// add multipart models ..
//rc.register(new MultiPartFeature());
//rc.register(new InjectionBinder());
@ -51,24 +67,26 @@ public class WebLauncher {
rc.registerClasses(TypeResource.class);
rc.registerClasses(UniverseResource.class);
rc.registerClasses(VideoResource.class);
rc.registerClasses(HealthCheck.class);
rc.registerClasses(Front.class);
// add jackson to be discovenr when we are ins standalone server
rc.register(JacksonFeature.class);
// enable this to show low level request
//rc.property(LoggingFeature.LOGGING_FEATURE_LOGGER_LEVEL_SERVER, Level.WARNING.getName());
System.out.println("Connect on the BDD:");
System.out.println(" getDBHost: '" + ConfigVariable.getDBHost() + "'");
System.out.println(" getDBPort: '" + ConfigVariable.getDBPort() + "'");
System.out.println(" getDBLogin: '" + ConfigVariable.getDBLogin() + "'");
System.out.println(" getDBPassword: '" + ConfigVariable.getDBPassword() + "'");
System.out.println(" getDBName: '" + ConfigVariable.getDBName() + "'");
//System.out.println("Connect on the BDD:");
//System.out.println(" getDBHost: '" + ConfigVariable.getDBHost() + "'");
//System.out.println(" getDBPort: '" + ConfigVariable.getDBPort() + "'");
//System.out.println(" getDBLogin: '" + ConfigVariable.getDBLogin() + "'");
//System.out.println(" getDBPassword: '" + ConfigVariable.getDBPassword() + "'");
//System.out.println(" getDBName: '" + ConfigVariable.getDBName() + "'");
dbConfig = new DBConfig(ConfigVariable.getDBHost(),
Integer.parseInt(ConfigVariable.getDBPort()),
ConfigVariable.getDBLogin(),
ConfigVariable.getDBPassword(),
ConfigVariable.getDBName());
System.out.println(" ==> " + dbConfig);
System.out.println("OAuth service " + ConfigVariable.getRestOAuthServer());
System.out.println("OAuth service " + getBaseURI());
HttpServer server = GrizzlyHttpServerFactory.createHttpServer(getBaseURI(), rc);
Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
@Override

View File

@ -2,14 +2,15 @@ package org.kar.karideo.api;
import org.glassfish.jersey.media.multipart.FormDataContentDisposition;
import org.glassfish.jersey.media.multipart.FormDataParam;
import org.kar.karideo.ConfigVariable;
import org.kar.karideo.GenericContext;
import org.kar.karideo.WebLauncher;
import org.kar.karideo.annotation.PermitTokenInURI;
import org.kar.karideo.db.DBEntry;
import org.kar.karideo.filter.GenericContext;
import org.kar.karideo.model.Data;
import org.kar.karideo.model.DataSmall;
import org.kar.karideo.util.ConfigVariable;
import javax.annotation.security.PermitAll;
import javax.annotation.security.RolesAllowed;
import javax.imageio.ImageIO;
import javax.ws.rs.*;
@ -380,7 +381,7 @@ public class DataResource {
System.out.println("===================================================");
DataSmall value = getSmall(id);
if (value == null) {
Response.status(404).
return Response.status(404).
entity("media NOT FOUND: " + id).
type("text/plain").
build();
@ -419,7 +420,8 @@ public class DataResource {
@GET
@Path("{id}/{name}")
@PermitTokenInURI
@RolesAllowed("USER")
//@RolesAllowed("USER")
@PermitAll
@Produces(MediaType.APPLICATION_OCTET_STREAM)
public Response retriveDataFull(@Context SecurityContext sc, @QueryParam(HttpHeaders.AUTHORIZATION) String token, @HeaderParam("Range") String range, @PathParam("id") Long id, @PathParam("name") String name) throws Exception {
GenericContext gc = (GenericContext) sc.getUserPrincipal();

View File

@ -0,0 +1,103 @@
package org.kar.karideo.api;
import java.io.File;
import java.util.List;
import javax.annotation.security.PermitAll;
import javax.ws.rs.*;
import javax.ws.rs.core.CacheControl;
import javax.ws.rs.core.PathSegment;
import javax.ws.rs.core.Response;
import javax.ws.rs.core.Response.ResponseBuilder;
import org.kar.karideo.util.ConfigVariable;
@Path("/karideo")
public class Front {
private String getExtension(String filename) {
if (filename.contains(".")) {
return filename.substring(filename.lastIndexOf(".") + 1);
}
return "";
}
private Response retrive(String fileName) throws Exception {
String filePathName = ConfigVariable.getFrontFolder() + File.separator + fileName;
String extention = getExtension(filePathName);
String mineType = null;
System.out.println("try retrive : '" + filePathName + "' '" + extention + "'");
if (extention.length() !=0 && extention.length() <= 5) {
if (extention.equalsIgnoreCase("jpg") || extention.equalsIgnoreCase("jpeg")) {
mineType = "image/jpeg";
} else if (extention.equalsIgnoreCase("gif")) {
mineType = "image/gif";
} else if (extention.equalsIgnoreCase("png")) {
mineType = "image/png";
} else if (extention.equalsIgnoreCase("svg")) {
mineType = "image/svg+xml";
} else if (extention.equalsIgnoreCase("webp")) {
mineType = "image/webp";
} else if (extention.equalsIgnoreCase("js")) {
mineType = "application/javascript";
} else if (extention.equalsIgnoreCase("json")) {
mineType = "application/json";
} else if (extention.equalsIgnoreCase("ico")) {
mineType = "image/x-icon";
} else if (extention.equalsIgnoreCase("html")) {
mineType = "text/html";
} else if (extention.equalsIgnoreCase("css")) {
mineType = "text/css";
} else {
return Response.status(403).
entity("Not supported model: '" + fileName + "'").
type("text/plain").
build();
}
} else {
mineType = "text/html";
filePathName = ConfigVariable.getFrontFolder() + File.separator + "index.html";
}
System.out.println(" ==> '" + filePathName + "'");
// reads input image
File download = new File(filePathName);
if (!download.exists()) {
return Response.status(404).
entity("Not Found: '" + fileName + "' extension='" + extention + "'").
type("text/plain").
build();
}
ResponseBuilder response = Response.ok((Object)download);
// use this if I want to download the file:
//response.header("Content-Disposition", "attachment; filename=" + fileName);
CacheControl cc = new CacheControl();
cc.setMaxAge(60);
cc.setNoCache(false);
response.cacheControl(cc);
response.type(mineType);
return response.build();
}
@GET
@PermitAll()
//@Produces(MediaType.APPLICATION_OCTET_STREAM)
//@CacheMaxAge(time = 1, unit = TimeUnit.DAYS)
public Response retrive0() throws Exception {
return retrive("index.html");
}
@GET
@Path("{any: .*}")
@PermitAll()
//@Produces(MediaType.APPLICATION_OCTET_STREAM)
//@CacheMaxAge(time = 10, unit = TimeUnit.DAYS)
public Response retrive1(@PathParam("any") List<PathSegment> segments) throws Exception {
String filename = "";
for (PathSegment elem: segments) {
if (!filename.isEmpty()) {
filename += File.separator;
}
filename += elem.getPath();
}
return retrive(filename);
}
}

View File

@ -0,0 +1,22 @@
package org.kar.karideo.api;
import javax.annotation.security.PermitAll;
import javax.ws.rs.*;
import javax.ws.rs.core.MediaType;
@Path("/health_check")
@Produces(MediaType.APPLICATION_JSON)
public class HealthCheck {
public class HealthResult {
public String value;
public HealthResult(String value) {
this.value = value;
}
}
// todo : do it better...
@GET
@PermitAll
public HealthResult getHealth() {
return new HealthResult("alive and kicking");
}
}

View File

@ -1,9 +1,9 @@
package org.kar.karideo.api;
import org.kar.karideo.GenericContext;
import org.kar.karideo.UserDB;
import org.kar.karideo.WebLauncher;
import org.kar.karideo.db.DBEntry;
import org.kar.karideo.filter.GenericContext;
import org.kar.karideo.model.User;
import org.kar.karideo.model.UserExtern;
import org.kar.karideo.model.UserPerso;

View File

@ -1,13 +1,10 @@
package org.kar.karideo;
package org.kar.karideo.filter;
import java.lang.reflect.Method;
import javax.annotation.security.DenyAll;
import javax.annotation.security.PermitAll;
import javax.annotation.security.RolesAllowed;
import org.kar.karideo.annotation.PermitTokenInURI;
import org.kar.karideo.model.User;
import org.kar.karideo.model.UserSmall;
import javax.annotation.Priority;
import javax.ws.rs.Priorities;
@ -21,6 +18,16 @@ import javax.ws.rs.core.MultivaluedMap;
import javax.ws.rs.core.PathSegment;
import javax.ws.rs.core.Response;
import javax.ws.rs.ext.Provider;
import org.kar.karideo.UserDB;
import org.kar.karideo.annotation.PermitTokenInURI;
import org.kar.karideo.model.User;
import org.kar.karideo.model.UserSmall;
import org.kar.karideo.util.JWTWrapper;
import com.nimbusds.jwt.JWTClaimsSet;
import java.io.IOException;
import java.util.Arrays;
import java.util.List;
@ -36,7 +43,6 @@ public class AuthenticationFilter implements ContainerRequestFilter {
@Context
private ResourceInfo resourceInfo;
private static final String REALM = "example";
private static final String AUTHENTICATION_SCHEME = "Yota";
@Override
@ -117,10 +123,11 @@ public class AuthenticationFilter implements ContainerRequestFilter {
abortWithUnauthorized(requestContext);
return;
}
// check JWT token (basic:)
// Extract the token from the Authorization header (Remove "Yota ")
String token = authorizationHeader.substring(AUTHENTICATION_SCHEME.length()).trim();
//System.out.println("token: " + token);
System.out.println("token: " + token);
User user = null;
@ -171,22 +178,22 @@ public class AuthenticationFilter implements ContainerRequestFilter {
requestContext.abortWith(
Response.status(Response.Status.UNAUTHORIZED)
.header(HttpHeaders.WWW_AUTHENTICATE,
AUTHENTICATION_SCHEME + " 215:asdfglkjsqdfgsd4fg56sd4fg23d45fg6sd81fg35sdf4g6d53s4fg3s2d41fg")
AUTHENTICATION_SCHEME + " base64(HEADER).base64(CONTENT).base64(KEY)")
.build());
}
private User validateToken(String authorization) throws Exception {
//System.out.println("-----------------------------------------------------");
System.out.println("---- TODO validate token ----");
//System.out.println("-----------------------------------------------------");
// Check if the token was issued by the server and if it's not expired
// Throw an Exception if the token is invalid
String[] value = authorization.split(":");
long user = Long.valueOf(value[0]);
String token = value[1];
UserSmall userOAuth = UserDB.getUserOAuth(user, token);
//System.out.println("Get local userOAuth : " + userOAuth);
// TODO: Set here the way of the default create user or need to have right to access on this website...
return UserDB.getUserOrCreate(userOAuth);
System.out.println(" validate token : " + authorization);
JWTClaimsSet ret = JWTWrapper.validateToken(authorization, "KarAuth");
// check the token is valid !!! (signed and coherent issuer...
if (ret == null) {
System.out.println("The token is not valid: '" + authorization + "'");
return null;
}
// check userID
String userUID = ret.getSubject();
long id = Long.parseLong(userUID);
System.out.println("request user: '" + userUID + "'");
return UserDB.getUserOrCreate(id, (String)ret.getClaim("login") );
}
}

View File

@ -1,4 +1,4 @@
package org.kar.karideo;
package org.kar.karideo.filter;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerResponseContext;

View File

@ -1,4 +1,4 @@
package org.kar.karideo;
package org.kar.karideo.filter;
import org.kar.karideo.model.User;

View File

@ -1,4 +1,4 @@
package org.kar.karideo;
package org.kar.karideo.filter;
import org.kar.karideo.model.User;

View File

@ -1,4 +1,4 @@
package org.kar.karideo;
package org.kar.karideo.filter;
import javax.ws.rs.container.ContainerRequestContext;
import javax.ws.rs.container.ContainerRequestFilter;

View File

@ -19,6 +19,10 @@ import java.util.HashMap;
import java.util.List;
import java.util.Map;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
public class MediaSmall {
public class MediaStreamProperty {
public Long id;
@ -42,7 +46,7 @@ public class MediaSmall {
public Integer date;
public Integer time;
public String ageLimit;
public List<Long> covers = new ArrayList<>();
public List<Long> covers = null;
public MediaStreamProperty media;
public MediaSmall(ResultSet rs) {
@ -86,6 +90,7 @@ public class MediaSmall {
this.ageLimit = rs.getString(iii++);
String coversString = rs.getString(iii++);
if (!rs.wasNull()) {
covers = new ArrayList<>();
String[] elements = coversString.split("-");
for (String elem : elements) {
Long tmp = Long.parseLong(elem);

View File

@ -17,12 +17,15 @@ import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import com.fasterxml.jackson.databind.annotation.JsonSerialize;
@JsonSerialize(include=JsonSerialize.Inclusion.NON_NULL)
public class NodeSmall {
public Long id;
public String name;
public String description;
public Long parentId;
public List<Long> covers = new ArrayList<>();
public List<Long> covers = null;
public NodeSmall(ResultSet rs) {
int iii = 1;
@ -36,10 +39,11 @@ public class NodeSmall {
}
String coversString = rs.getString(iii++);
if (!rs.wasNull()) {
this.covers = new ArrayList<>();
String[] elements = coversString.split("-");
for (String elem : elements) {
Long tmp = Long.parseLong(elem);
covers.add(tmp);
this.covers.add(tmp);
}
}
} catch (SQLException ex) {

View File

@ -21,12 +21,10 @@ import java.sql.Timestamp;
public class User {
public Long id;
public String login;
public String email;
public Timestamp lastConnection;
public boolean admin;
public boolean blocked;
public boolean removed;
public Long avatar;
public User() {
}
@ -35,11 +33,9 @@ public class User {
this.id = id;
this.login = login;
this.lastConnection = lastConnection;
this.email = email;
this.admin = admin;
this.blocked = blocked;
this.removed = removed;
this.avatar = avatar;
}
public User(ResultSet rs) {
@ -48,14 +44,9 @@ public class User {
this.id = rs.getLong(iii++);
this.lastConnection = rs.getTimestamp(iii++);
this.login = rs.getString(iii++);
this.email = rs.getString(iii++);
this.admin = "TRUE".equals(rs.getString(iii++));
this.blocked = "TRUE".equals(rs.getString(iii++));
this.removed = "TRUE".equals(rs.getString(iii++));
this.avatar = rs.getLong(iii++);
if (rs.wasNull()) {
this.avatar = null;
}
} catch (SQLException ex) {
ex.printStackTrace();
}
@ -66,12 +57,10 @@ public class User {
return "User{" +
"id=" + id +
", login='" + login + '\'' +
", email='" + email + '\'' +
", lastConnection='" + lastConnection + '\'' +
", admin=" + admin +
", blocked=" + blocked +
", removed=" + removed +
", avatar=" + avatar +
'}';
}
}

View File

@ -18,13 +18,11 @@ public class UserExtern {
public Long id;
public String login;
public boolean admin;
public Long avatar;
public UserExtern(User other) {
this.id = other.id;
this.login = other.login;
this.admin = other.admin;
this.avatar = other.avatar;
}
@Override
@ -33,7 +31,6 @@ public class UserExtern {
"id=" + id +
", login='" + login + '\'' +
", admin=" + admin +
", avatar=" + avatar +
'}';
}
}

View File

@ -17,20 +17,16 @@ CREATE TABLE `user` (
public class UserPerso {
public Long id;
public String login;
public String email;
public boolean admin;
public boolean blocked;
public boolean removed;
public Long avatar;
public UserPerso(User other) {
this.id = other.id;
this.login = other.login;
this.email = other.email;
this.admin = other.admin;
this.blocked = other.blocked;
this.removed = other.removed;
this.avatar = other.avatar;
}
@Override
@ -38,11 +34,9 @@ public class UserPerso {
return "User{" +
"id=" + id +
", login='" + login + '\'' +
", email='" + email + '\'' +
", admin=" + admin +
", blocked=" + blocked +
", removed=" + removed +
", avatar=" + avatar +
'}';
}
}

View File

@ -1,4 +1,4 @@
package org.kar.karideo;
package org.kar.karideo.util;
public class ConfigVariable {
@ -18,16 +18,17 @@ public class ConfigVariable {
return out;
}
public static String getRestOAuthServer() {
String out = System.getenv("org.kar.karideo.rest.oauth");
public static String getFrontFolder() {
String out = System.getenv("ORG_KARIDEO_FRONT_FOLDER");
if (out == null) {
return "http://localhost:17080/karauth/api/";
return "/application/karideo";
}
return out;
}
public static String getDBHost() {
String out = System.getenv("org.kar.karideo.db.host");
String out = System.getenv("ORG_KARIDEO_DB_HOST");
if (out == null) {
return "localhost";
}
@ -35,15 +36,15 @@ public class ConfigVariable {
}
public static String getDBPort() {
String out = System.getenv("org.kar.karideo.db.port");
String out = System.getenv("ORG_KARIDEO_DB_PORT");
if (out == null) {
return "15306";
return "17036";
}
return out;
}
public static String getDBLogin() {
String out = System.getenv("org.kar.karideo.db.login");
String out = System.getenv("ORG_KARIDEO_DB_LOGIN");
if (out == null) {
return "root";
}
@ -53,7 +54,7 @@ public class ConfigVariable {
public static String getDBPassword() {
String out = System.getenv("MYSQL_ROOT_PASSWORD");
if (out == null) {
return "klkhj456gkgtkhjgvkujfhjgkjhgsdfhb3467465fgdhdesfgh";
return "ZERTYSDGFVHSDFGHJYZSDFGSQxfgsqdfgsqdrf4564654";
}
return out;
}
@ -67,10 +68,18 @@ public class ConfigVariable {
}
public static String getlocalAddress() {
String out = System.getenv("org.kar.karideo.address");
String out = System.getenv("ORG_KARIDEO_ADDRESS");
if (out == null) {
return "http://0.0.0.0:18080/karideo/api/";
}
return out;
}
public static String getSSOAddress() {
String out = System.getenv("SSO_ADDRESS");
if (out == null) {
return "http://192.168.1.156/karauth/api/";
}
return out;
}
}

View File

@ -0,0 +1,175 @@
package org.kar.karideo.util;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.HttpURLConnection;
import java.net.URL;
import java.text.ParseException;
import java.util.Date;
import java.util.UUID;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.nimbusds.jose.JOSEException;
import com.nimbusds.jose.JOSEObjectType;
import com.nimbusds.jose.JWSAlgorithm;
import com.nimbusds.jose.JWSHeader;
import com.nimbusds.jose.JWSSigner;
import com.nimbusds.jose.JWSVerifier;
import com.nimbusds.jose.crypto.RSASSASigner;
import com.nimbusds.jose.crypto.RSASSAVerifier;
import com.nimbusds.jose.jwk.RSAKey;
import com.nimbusds.jose.jwk.gen.RSAKeyGenerator;
import com.nimbusds.jwt.JWTClaimsSet;
import com.nimbusds.jwt.SignedJWT;
public class JWTWrapper {
private static RSAKey rsaJWK = null;;
private static RSAKey rsaPublicJWK = null;
public static class PublicKey {
public String key;
public PublicKey(String key) {
this.key = key;
}
public PublicKey() {
}
}
public static void initLocalTokenRemote(String ssoUri, String application) throws IOException, ParseException {
// check Token:
URL obj = new URL(ssoUri + "public_key");
System.out.println("Request token from:" + obj);
HttpURLConnection con = (HttpURLConnection) obj.openConnection();
con.setRequestMethod("GET");
con.setRequestProperty("User-Agent", application);
con.setRequestProperty("Cache-Control", "no-cache");
con.setRequestProperty("Content-Type", "application/json");
con.setRequestProperty("Accept", "application/json");
int responseCode = con.getResponseCode();
System.out.println("GET Response Code :: " + responseCode);
if (responseCode == HttpURLConnection.HTTP_OK) { // success
BufferedReader in = new BufferedReader(new InputStreamReader(con.getInputStream()));
String inputLine;
StringBuffer response = new StringBuffer();
while ((inputLine = in.readLine()) != null) {
response.append(inputLine);
}
in.close();
// print result
System.out.println(response.toString());
ObjectMapper mapper = new ObjectMapper();
;
PublicKey values = mapper.readValue(response.toString(), PublicKey.class);
rsaPublicJWK = RSAKey.parse(values.key);
}
System.out.println("GET JWT validator token not worked");
}
public static void initLocalToken() throws Exception{
// RSA signatures require a public and private RSA key pair, the public key
// must be made known to the JWS recipient in order to verify the signatures
try {
String generatedStringForKey = UUID.randomUUID().toString();
rsaJWK = new RSAKeyGenerator(2048).keyID(generatedStringForKey).generate();
rsaPublicJWK = rsaJWK.toPublicJWK();
//System.out.println("RSA key (all): " + rsaJWK.toJSONString());
//System.out.println("RSA key (pub): " + rsaPublicJWK.toJSONString());
} catch (JOSEException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("Can not generate teh public abnd private keys ...");
rsaJWK = null;
rsaPublicJWK = null;
}
}
public static void initValidateToken(String publicKey) {
try {
rsaPublicJWK = RSAKey.parse(publicKey);
} catch (ParseException e) {
e.printStackTrace();
System.out.println("Can not retrieve public Key !!!!!!!! RSAKey='" + publicKey + "'");
}
}
public static String getPublicKey() {
if (rsaPublicJWK == null) {
return null;
}
return rsaPublicJWK.toJSONString();
}
/**
* Create a token with the provided elements
* @param userID UniqueId of the USER (global unique ID)
* @param userLogin Login of the user (never change)
* @param isuer The one who provide the Token
* @param timeOutInMunites Expiration of the token.
* @return the encoded token
*/
public static String generateJWToken(long userID, String userLogin, String isuer, int timeOutInMunites) {
if (rsaJWK == null) {
System.out.println("JWT private key is not present !!!");
return null;
}
try {
// Create RSA-signer with the private key
JWSSigner signer = new RSASSASigner(rsaJWK);
// Prepare JWT with claims set
JWTClaimsSet claimsSet = new JWTClaimsSet.Builder()
.subject(Long.toString(userID))
.claim("login", userLogin)
.issuer(isuer)
.issueTime(new Date())
.expirationTime(new Date(new Date().getTime() + 60 * timeOutInMunites * 1000 /* millisecond */))
.build();
SignedJWT signedJWT = new SignedJWT(new JWSHeader.Builder(JWSAlgorithm.RS256).type(JOSEObjectType.JWT)/*.keyID(rsaJWK.getKeyID())*/.build(), claimsSet);
// Compute the RSA signature
signedJWT.sign(signer);
// serialize the output...
return signedJWT.serialize();
} catch (JOSEException ex) {
ex.printStackTrace();
}
return null;
}
public static JWTClaimsSet validateToken(String signedToken, String isuer) {
if (rsaPublicJWK == null) {
System.out.println("JWT public key is not present !!!");
return null;
}
try {
// On the consumer side, parse the JWS and verify its RSA signature
SignedJWT signedJWT = SignedJWT.parse(signedToken);
JWSVerifier verifier = new RSASSAVerifier(rsaPublicJWK);
if (!signedJWT.verify(verifier)) {
System.out.println("JWT token is NOT verified ");
return null;
}
if (!new Date().before(signedJWT.getJWTClaimsSet().getExpirationTime())) {
System.out.println("JWT token is expired now = " + new Date() + " with=" + signedJWT.getJWTClaimsSet().getExpirationTime() );
return null;
}
if (!isuer.equals(signedJWT.getJWTClaimsSet().getIssuer())) {
System.out.println("JWT issuer is wong: '" + isuer + "' != '" + signedJWT.getJWTClaimsSet().getIssuer() + "'" );
return null;
}
// the element must be validated outside ...
//System.out.println("JWT token is verified 'alice' =?= '" + signedJWT.getJWTClaimsSet().getSubject() + "'");
//System.out.println("JWT token isuer 'https://c2id.com' =?= '" + signedJWT.getJWTClaimsSet().getIssuer() + "'");
return signedJWT.getJWTClaimsSet();
} catch (JOSEException ex) {
ex.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}

View File

@ -0,0 +1,10 @@
package org.kar.karideo.util;
public class PublicKey {
public String key;
public PublicKey(String key) {
this.key = key;
}
}

View File

@ -10,35 +10,38 @@ services:
volumes:
- /workspace/data/karideo/db:/var/lib/mysql
mem_limit: 600m
healthcheck:
test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost"]
timeout: 20s
retries: 10
karideo_adminer_service:
karauth_adminer_service:
image: adminer:latest
restart: always
depends_on:
- karideo_db_service
ports:
- 18079:8080
links:
- karideo_db_service:db
read_only: true
mem_limit: 100m
karideo_back_service:
build: back/
build: .
restart: always
image: org.kar.video.back
image: org.kar.karideo
depends_on:
- karideo_db_service
ports:
- 18080:18080
env_file:
- ./config.env
links:
- karideo_db_service:db
volumes:
- /workspace/data/karideo/media:/application/data
read_only: true
mem_limit: 1200m
karideo_front_service:
build: front/
restart: always
image: org.kar.video.front
ports:
#- 15081:4200
- 18081:80
mem_limit: 100m
healthcheck:
test: ["CMD", "wget" ,"http://localhost:18080/karideo/api/health_check", "-O", "/dev/null"]
timeout: 20s
retries: 3

View File

@ -7,19 +7,7 @@
import { NgModule } from '@angular/core';
import { Routes, RouterModule } from '@angular/router'; // CLI imports router
import { HomeScene } from './scene/home/home';
import { TypeScene } from './scene/type/type';
import { UniverseScene } from './scene/universe/universe';
import { SeriesScene } from './scene/series/series';
import { SeasonScene } from './scene/season/season';
import { VideoScene } from './scene/video/video';
import { LoginScene } from './scene/login/login';
import { SignUpScene } from './scene/sign-up/sign-up';
import { SettingsScene } from './scene/settings/settings';
import { UploadScene } from './scene/upload/upload';
import { VideoEditScene } from './scene/video-edit/video-edit';
import { SeriesEditScene } from './scene/series-edit/series-edit';
import { SeasonEditScene } from './scene/season-edit/season-edit';
import { HelpScene, HomeScene, SeasonEditScene, SeasonScene, SeriesEditScene, SeriesScene, SettingsScene, SsoScene, TypeScene, UniverseScene, UploadScene, VideoEditScene, VideoScene } from './scene';
// import { HelpComponent } from './help/help.component';
// see https://angular.io/guide/router
@ -42,26 +30,14 @@ const routes: Routes = [
{ path: 'video/:universeId/:typeId/:seriesId/:seasonId/:videoId', component: VideoScene },
{ path: 'video-edit/:universeId/:typeId/:seriesId/:seasonId/:videoId', component: VideoEditScene },
{ path: 'login', component: LoginScene },
{ path: 'signup', component: SignUpScene },
{ path: 'sso/:data/:keepConnected/:token', component: SsoScene },
{ path: 'sso', component: SsoScene },
{ path: 'help/:page', component: HelpScene },
{ path: 'help', component: HelpScene },
{ path: 'settings', component: SettingsScene },
/* { path: 'help', component: HelpComponent }*/
];
/*
@NgModule({
imports: [
RouterModule.forRoot(routes)
],
exports: [
RouterModule
]
})
export class AppRoutingModule {}
*/
@NgModule({
imports: [ RouterModule.forRoot(routes, { relativeLinkResolution: 'legacy' }) ],
exports: [ RouterModule ]

View File

@ -6,5 +6,5 @@
<div class="main-modal" ng-include="currentModal" ng-if="currentModal != ''" ></div> <!-- (click)="onOutModal()" -->
-->
<div class="main-content">
<router-outlet *ngIf="isConnected"></router-outlet>
<router-outlet *ngIf="autoConnectedDone"></router-outlet>
</div>

View File

@ -5,9 +5,8 @@
*/
import { Component, OnInit } from '@angular/core';
import { UserService } from './service/user';
import { SessionService } from './service/session';
import { CookiesService } from './service/cookies';
import { ActivatedRoute, Router } from '@angular/router';
import { UserService, SessionService } from './service';
@Component({
selector: 'app-root',
@ -18,41 +17,29 @@ import { CookiesService } from './service/cookies';
})
export class AppComponent implements OnInit {
title: string = 'Karideo';
autoConnectedDone: boolean = false;
isConnected: boolean = false;
constructor(private cookiesService: CookiesService,
constructor(
private router: Router,
private userService: UserService,
private sessionService: SessionService) {
}
ngOnInit() {
let login = this.cookiesService.get('yota-login');
let password = this.cookiesService.get('yota-password');
this.autoConnectedDone = false;
this.isConnected = false;
if(login !== '' &&
password !== '' &&
password.length > 40) {
console.log(`Get previous connection ... ${ login }:xxxxxx`);
let self = this;
this.userService.loginSha(login, password)
.then((response: any) => {
console.log('auto log ==> OK');
self.sessionService.create(response.session,
response.login,
response.email,
response.admin,
response.avatar);
this.isConnected = true;
// self.router.navigate(['home']);
}).catch((response: any) => {
console.log('auto log ==> Error');
self.cookiesService.remove('yota-login');
self.cookiesService.remove('yota-password');
this.isConnected = true;
// this force the need to refresh after connection ...
this.sessionService.change.subscribe((isConnected) => {
console.log(`receive event from session ...${ isConnected}`);
self.isConnected = isConnected;
self.autoConnectedDone = true;
});
this.userService.checkAutoConnect().finally(() => {
self.autoConnectedDone = true;
});
}
}
}

View File

@ -24,41 +24,12 @@ import { PopInCreateType } from './popin/create-type/create-type';
import { PopInUploadProgress } from './popin/upload-progress/upload-progress';
import { PopInDeleteConfirm } from './popin/delete-confirm/delete-confirm';
import { HelpScene } from './scene/help/help';
import { LoginScene } from './scene/login/login';
import { SignUpScene } from './scene/sign-up/sign-up';
import { ValidateEmailScene } from './scene/validate-email/validate-email';
import { HomeScene } from './scene/home/home';
import { TypeScene } from './scene/type/type';
import { UniverseScene } from './scene/universe/universe';
import { SeriesScene } from './scene/series/series';
import { SeasonScene } from './scene/season/season';
import { VideoScene } from './scene/video/video';
import { SettingsScene } from './scene/settings/settings';
import { ErrorViewerScene } from './scene/error-viewer/error-viewer';
import { ErrorComponent } from './error/error';
import { VideoEditScene } from './scene/video-edit/video-edit';
import { UploadScene } from './scene/upload/upload';
import { SeasonEditScene } from './scene/season-edit/season-edit';
import { SeriesEditScene } from './scene/series-edit/series-edit';
import { AuthService } from './service/auth';
import { ArianeService } from './service/ariane';
import { CookiesService } from './service/cookies';
import { HttpWrapperService } from './service/http-wrapper';
//import { HttpOAuthWrapperService } from './service/http-oauth-wrapper';
import { UserService } from './service/user';
import { UniverseService } from './service/universe';
import { SeriesService } from './service/series';
import { DataService } from './service/data';
import { TypeService } from './service/type';
import { SeasonService } from './service/season';
import { VideoService } from './service/video';
import { SessionService } from './service/session';
import { BddService } from './service/bdd';
import { PopInService } from './service/popin';
import { AppComponent } from './app.component';
import { ErrorComponent } from './error/error';
import { HomeScene, ErrorViewerScene, HelpScene, SsoScene, TypeScene, UniverseScene, SeriesScene, SeasonScene, VideoScene, SettingsScene,
VideoEditScene, SeasonEditScene, SeriesEditScene, UploadScene } from './scene';
import { PopInService, HttpWrapperService, SessionService, CookiesService, StorageService, UserService, SSOService, BddService, TypeService,
DataService, UniverseService, SeriesService, SeasonService, VideoService, ArianeService } from './service';
@NgModule({
declarations: [
@ -77,22 +48,20 @@ import { AppComponent } from './app.component';
PopInUploadProgress,
PopInDeleteConfirm,
HelpScene,
LoginScene,
SignUpScene,
ValidateEmailScene,
HomeScene,
ErrorViewerScene,
HelpScene,
SsoScene,
TypeScene,
UniverseScene,
SeriesScene,
SeasonScene,
VideoScene,
SettingsScene,
ErrorViewerScene,
VideoEditScene,
SeasonEditScene,
SeriesEditScene,
UploadScene
UploadScene,
],
imports: [
BrowserModule,
@ -105,11 +74,12 @@ import { AppComponent } from './app.component';
providers: [
PopInService,
HttpWrapperService,
BddService,
AuthService,
SessionService,
CookiesService,
StorageService,
UserService,
SSOService,
BddService,
TypeService,
DataService,
UniverseService,
@ -122,16 +92,16 @@ import { AppComponent } from './app.component';
AppComponent,
TopMenuComponent,
UploadFileComponent,
ErrorComponent,
ElementTypeComponent,
ElementSeriesComponent,
ElementSeasonComponent,
ElementVideoComponent,
ErrorComponent,
PopInCreateType,
PopInComponent,
PopInUploadProgress,
PopInDeleteConfirm
PopInDeleteConfirm,
],
bootstrap: [
AppComponent

View File

@ -1,4 +1,2 @@
<div>
<!--<canvas width="200" height="250" style="border:1px solid #d3d3d3;" id="imageCanvas" #imageCanvas></canvas>-->
<img src="{{cover}}"/>
</div>
<!--<canvas width="200" height="250" style="border:1px solid #d3d3d3;" id="imageCanvas" #imageCanvas></canvas>-->
<img src="{{cover}}"/>

View File

@ -5,8 +5,8 @@
</span>
</div>
<div class="imgContainer-small">
<div *ngIf="cover">
<img src="{{cover}}" alt="type image" class="miniature-small"/>
<div *ngIf="covers">
<img src="{{covers[0]}}" alt="type image" class="miniature-small"/>
</div>
</div>
<div class="title-small">

View File

@ -4,8 +4,10 @@
* @license PROPRIETARY (see license file)
*/
import { Injectable, Component, OnInit, Input } from '@angular/core';
import { isArrayOf, isNumberFinite } from '../../utils';
import { TypeService } from '../../service/type';
import { NodeData } from '../..//model';
@Component({
selector: 'app-element-type',
@ -13,86 +15,50 @@ import { TypeService } from '../../service/type';
styleUrls: [ './element-type.less' ]
})
@Injectable()
//@Injectable()
export class ElementTypeComponent implements OnInit {
// input parameters
@Input() idType:number = -1;
imageSource:string = '';
name:string = '';
error:string = '';
description:string = '';
countvideo:number = null;
countserie:number = null;
public name: string = 'rr';
public description: string = 'sdqdfqsd';
cover:string = '';
covers:Array<string> = [];
public imageSource:string; // TODO: remove this ...
public error:string;
public countvideo:number;
public countserie:number;
public covers: string[];
constructor(private typeService: TypeService) {
}
ngOnInit() {
this.name = `ll ${ this.idType}`;
let self = this;
console.log(`get parameter id: ${ this.idType}`);
//console.log(`get parameter id: ${ this.idType}`);
this.typeService.get(this.idType)
.then((response) => {
.then((response: NodeData) => {
//console.log("Get element ! " + JSON.stringify(response));
self.error = '';
self.name = response.name;
self.description = response.description;
if(response.covers === undefined || response.covers === null || response.covers.length === 0) {
self.cover = null;
// self.covers = [];
if(!isArrayOf(response.covers, isNumberFinite) || response.covers.length === 0) {
self.covers = undefined;
} else {
self.cover = self.typeService.getCoverThumbnailUrl(response.covers[0]);
self.covers = [];
for(let iii = 0; iii < response.covers.length; iii++) {
self.covers.push(self.typeService.getCoverThumbnailUrl(response.covers[iii]));
}
}
switch (self.name) {
case 'Documentary':
self.imageSource = 'assets/images/type_documentary.svg';
break;
case 'Movie':
self.imageSource = 'assets/images/type_film.svg';
break;
case 'Annimation':
self.imageSource = 'assets/images/type_annimation.svg';
break;
case 'Short Films':
self.imageSource = 'assets/images/type_film-short.svg';
break;
case 'tv show':
self.imageSource = 'assets/images/type_tv-show.svg';
break;
case 'Anniation tv show':
self.imageSource = 'assets/images/type_tv-show-annimation.svg';
break;
case 'Theater':
self.imageSource = 'assets/images/type_theater.svg';
break;
case 'One man show':
self.imageSource = 'assets/images/type_one-man-show.svg';
break;
case 'Concert':
self.imageSource = 'assets/images/type_concert.svg';
break;
case 'Opera':
self.imageSource = 'assets/images/type_opera.svg';
break;
default:
break;
}
}).catch((response) => {
self.error = 'Can not get the data';
self.name = '';
self.description = '';
self.imageSource = '';
self.cover = null;
self.name = undefined;
self.description = undefined;
self.imageSource = undefined;
self.covers = [];
});
this.typeService.countVideo(this.idType)
.then((response) => {
.then((response: number) => {
self.countvideo = response;
}).catch((response) => {
self.countvideo = 0;

View File

@ -2,7 +2,7 @@
<div class="videoImgContainer">
<div *ngIf="cover">
<!--<data-image id="{{cover}}"></data-image>-->
<img src="{{cover}}"/>-->
<img src="{{cover}}"/>
</div>
<div *ngIf="!cover" class="noImage">

View File

@ -6,7 +6,7 @@
import { Component, Input, Output, OnInit, OnDestroy, EventEmitter } from '@angular/core';
import { PopInService } from '../../service/popin';
import { PopInService } from '../../service';
@Component({
// moduleId: module.id.toString(),

View File

@ -12,7 +12,7 @@
</button>
<div class="ariane">
<button class="item"
*ngIf="arianeTypeId != null"
*ngIf="arianeTypeId !== null"
title="Uype"
(click)="onArianeType($event)"
(auxclick)="onArianeType($event)">
@ -23,9 +23,9 @@
T
</div>
</button>
<div class="item_ariane_separator" *ngIf="arianeUniverseId != null && arianeTypeId != null" >/</div>
<div class="item_ariane_separator" *ngIf="arianeUniverseId !== null && arianeTypeId !== null" >/</div>
<button class="item"
*ngIf="arianeUniverseId != null"
*ngIf="arianeUniverseId !== null"
title="Universe"
(click)="onArianeUniverse($event)"
(auxclick)="onArianeUniverse($event)">
@ -36,9 +36,9 @@
U
</div>
</button>
<div class="item_ariane_separator" *ngIf="arianeSeriesId != null && (arianeUniverseId != null || arianeTypeId != null)" >/</div>
<div class="item_ariane_separator" *ngIf="arianeSeriesId !== null && (arianeUniverseId !== null || arianeTypeId !== null)" >/</div>
<button class="item"
*ngIf="arianeSeriesId != null"
*ngIf="arianeSeriesId !== null"
title="Series"
(click)="onArianeSeries($event)"
(auxclick)="onArianeSeries($event)">
@ -49,9 +49,9 @@
G
</div>
</button>
<div class="item_ariane_separator" *ngIf="arianeSeasonId != null && (arianeSeriesId != null || arianeUniverseId != null || arianeTypeId != null)" >/</div>
<div class="item_ariane_separator" *ngIf="arianeSeasonId !== null && (arianeSeriesId !== null || arianeUniverseId !== null || arianeTypeId !== null)" >/</div>
<button class="item"
*ngIf="arianeSeasonId != null"
*ngIf="arianeSeasonId !== null"
title="Season"
(click)="onArianeSeason($event)"
(auxclick)="onArianeSeason($event)">
@ -66,8 +66,8 @@
<button class="item"
*ngIf="login === null"
style="float:right;"
(click)="onSignIn($event)"
(auxclick)="onSignIn($event)">
(click)="onSignUp($event)"
(auxclick)="onSignUp($event)">
<div class="xdesktop">
<i class="material-icons">add_circle_outline</i> Sign-up
</div>
@ -76,10 +76,10 @@
</div>
</button>
<button class="item"
*ngIf="login == null"
*ngIf="login === null"
style="float:right;"
(click)="onLogin($event)"
(auxclick)="onLogin($event)">
(click)="onSignIn($event)"
(auxclick)="onSignIn($event)">
<div class="xdesktop">
<i class="material-icons">account_circle</i> Sign-in
</div>
@ -88,13 +88,13 @@
</div>
</button>
<button class="item"
*ngIf="login != null"
*ngIf="login !== null"
style="float:right; height:56px;"
(click)="onAvatar()">
<img class="avatar" src="{{avatar}}"/>
</button>
<button class="item"
*ngIf="editShow == true"
*ngIf="editShow === true"
style="float:right; height:56px;"
(click)="onEdit()">
<div class="xdesktop">
@ -105,7 +105,7 @@
</div>
</button>
</div>
<div class="fill-all" *ngIf="login != null &amp;&amp; displayUserMenu == true" (click)="onOutUserProperty()">
<div class="fill-all" *ngIf="login !== null && displayUserMenu === true" (click)="onOutUserProperty()">
<!-- (click)="onOutUserProperty()" -->
<div class="sub-menu user-menu color-menu-background">
<button class="item" disabled="disabled">
@ -139,32 +139,32 @@
<div class="sub-menu edit-menu color-menu-background">
<!--
<button class="item"
*ngIf="arianeTypeId != null"
*ngIf="arianeTypeId !== null"
(click)="onSubEditType($event)"
(auxclick)="onSubEditType($event)">
<b>Edit Type</b>
</button>
<button class="item"
*ngIf="arianeUniverseId != null"
*ngIf="arianeUniverseId !== null"
(click)="onSubEditUniverse($event)"
(auxclick)="onSubEditUniverse($event)">
<b>Edit Universe</b>
</button>
-->
<button class="item"
*ngIf="arianeSeriesId != null"
*ngIf="arianeSeriesId !== null"
(click)="onSubEditSeries($event)"
(auxclick)="onSubEditSeries($event)">
<b>Edit Series</b>
</button>
<button class="item"
*ngIf="arianeSeasonId != null"
*ngIf="arianeSeasonId !== null"
(click)="onSubEditSeason($event)"
(auxclick)="onSubEditSeason($event)">
<b>Edit Season</b>
</button>
<button class="item"
*ngIf="arianeVideoId != null"
*ngIf="arianeVideoId !== null"
(click)="onSubEditVideo($event)"
(auxclick)="onSubEditVideo($event)">
<b>Edit Video</b>
@ -175,32 +175,32 @@
<div class="sub-menu edit-menu-mob color-menu-background">
<!--
<button class="item"
*ngIf="arianeTypeId != null"
*ngIf="arianeTypeId !== null"
(click)="onSubEditType($event)"
(auxclick)="onSubEditType($event)">
<b>Edit Type</b>
</button>
<button class="item"
*ngIf="arianeUniverseId != null"
*ngIf="arianeUniverseId !== null"
(click)="onSubEditUniverse($event)"
(auxclick)="onSubEditUniverse($event)">
<b>Edit Universe</b>
</button>
-->
<button class="item"
*ngIf="arianeSeriesId != null"
*ngIf="arianeSeriesId !== null"
(click)="onSubEditSeries($event)"
(auxclick)="onSubEditSeries($event)">
<b>Edit Series</b>
</button>
<button class="item"
*ngIf="arianeSeasonId != null"
*ngIf="arianeSeasonId !== null"
(click)="onSubEditSeason($event)"
(auxclick)="onSubEditSeason($event)">
<b>Edit Season</b>
</button>
<button class="item"
*ngIf="arianeVideoId != null"
*ngIf="arianeVideoId !== null"
(click)="onSubEditVideo($event)"
(auxclick)="onSubEditVideo($event)">
<b>Edit Video</b>

View File

@ -8,8 +8,7 @@ import { Injectable, Component, OnInit } from '@angular/core';
// import { AppRoutingModule } from "../app-routing.module";
import { Router } from '@angular/router';
import { SessionService } from '../../service/session';
import { ArianeService } from '../../service/ariane';
import { UserService, SessionService, SSOService, ArianeService } from '../../service';
@Component({
selector: 'app-top-menu',
@ -42,25 +41,27 @@ export class TopMenuComponent implements OnInit {
constructor(private router: Router,
private sessionService: SessionService,
private arianeService: ArianeService) {
private arianeService: ArianeService,
private userService: UserService,
private ssoService: SSOService) {
}
ngOnInit() {
let self = this;
this.sessionService.change.subscribe((isConnected) => {
console.log(`receive event from session ...${ isConnected}`);
console.log(`TOP-MENU: receive event from session ...${isConnected}`);
if(isConnected === false) {
this.login = null;
this.avatar = null;
this.displayUserMenu = false;
self.login = null;
self.avatar = null;
self.displayUserMenu = false;
} else {
this.login = this.sessionService.getLogin();
this.avatar = this.sessionService.getAvatar();
this.displayUserMenu = false;
console.log(` login:${ this.sessionService.getLogin()}`);
console.log(` avatar:${ this.avatar}`);
self.updateIsJusteLogged();
}
});
if (this.sessionService.islogged()) {
this.updateIsJusteLogged();
}
this.arianeService.typeChange.subscribe((typeId: number) => {
this.arianeTypeId = typeId;
this.arianeTypeName = this.arianeService.getTypeName();
@ -87,54 +88,22 @@ export class TopMenuComponent implements OnInit {
this.updateEditShow();
});
}
updateEditShow():void {
this.editShow = /* this.arianeTypeId !== null
|| this.arianeUniverseId !== null
||*/ this.arianeSeriesId !== null ||
this.arianeSeasonId !== null ||
this.arianeVideoId !== null;
private updateIsJusteLogged(): void {
this.login = this.sessionService.getLogin();
this.avatar = this.sessionService.getAvatar();
this.displayUserMenu = false;
console.log(` login:${this.sessionService.getLogin()}`);
console.log(` avatar:${this.avatar}`);
}
onAvatar(): void {
console.log(`onAvatar() ${ this.displayUserMenu}`);
this.displayUserMenu = !this.displayUserMenu;
this.displayEditMenu = false;
}
onEdit(): void {
console.log('onEdit()');
this.displayEditMenu = !this.displayEditMenu;
this.displayUserMenu = false;
}
onSubEditVideo(event: any): void {
console.log('onSubEdit()');
this.displayEditMenu = false;
this.displayUserMenu = false;
this.arianeService.navigateVideoEdit(this.arianeVideoId, event.which === 2);
}
onSubEditSeason(event: any): void {
console.log('onSubEdit()');
this.displayEditMenu = false;
this.displayUserMenu = false;
this.arianeService.navigateSeasonEdit(this.arianeSeasonId, event.which === 2);
}
onSubEditSeries(event: any): void {
console.log('onSubEdit()');
this.displayEditMenu = false;
this.displayUserMenu = false;
this.arianeService.navigateSeriesEdit(this.arianeSeriesId, event.which === 2);
}
onSubEditUniverse(event: any): void {
console.log('onSubEdit()');
this.displayEditMenu = false;
this.displayUserMenu = false;
this.arianeService.navigateUniverseEdit(this.arianeUniverseId, event.which === 2);
}
onSubEditType(event: any): void {
console.log('onSubEditType()');
this.displayEditMenu = false;
this.displayUserMenu = false;
this.arianeService.navigateTypeEdit(this.arianeTypeId, event.which === 2);
}
onHome(event: any): void {
console.log('onHome()');
@ -143,29 +112,23 @@ export class TopMenuComponent implements OnInit {
onSignIn(event: any): void {
console.log('onSignIn()');
// Session.destroy();
this.router.navigate([ 'signup' ]);
this.ssoService.requestSignIn();
}
onLogin(event: any): void {
console.log('onLogin()');
// Session.destroy();
this.router.navigate([ 'login' ]);
onSignUp(event: any): void {
console.log('onSignIn()');
this.ssoService.requestSignUp();
this.displayUserMenu = false;
}
onLogout(event: any): void {
console.log('onLogout()');
this.sessionService.destroy();
this.router.navigate([ 'home' ]);
this.ssoService.requestSignOut();
this.userService.logOut();
this.router.navigate(['home']);
this.displayUserMenu = false;
}
onAddMedia(event: any): void {
console.log('onAddMedia()');
this.router.navigate([ 'upload' ]);
this.displayUserMenu = false;
}
onSetting(event: any): void {
console.log('onSetting()');
@ -204,4 +167,52 @@ export class TopMenuComponent implements OnInit {
console.log(`onArianeSeason(${ this.arianeSeasonId })`);
this.arianeService.navigateSeason(this.arianeSeasonId, event.which === 2);
}
updateEditShow():void {
this.editShow = /* this.arianeTypeId !== null
|| this.arianeUniverseId !== null
||*/ this.arianeSeriesId !== null ||
this.arianeSeasonId !== null ||
this.arianeVideoId !== null;
}
onEdit(): void {
console.log('onEdit()');
this.displayEditMenu = !this.displayEditMenu;
this.displayUserMenu = false;
}
onSubEditVideo(event: any): void {
console.log('onSubEdit()');
this.displayEditMenu = false;
this.displayUserMenu = false;
this.arianeService.navigateVideoEdit(this.arianeVideoId, event.which === 2);
}
onSubEditSeason(event: any): void {
console.log('onSubEdit()');
this.displayEditMenu = false;
this.displayUserMenu = false;
this.arianeService.navigateSeasonEdit(this.arianeSeasonId, event.which === 2);
}
onSubEditSeries(event: any): void {
console.log('onSubEdit()');
this.displayEditMenu = false;
this.displayUserMenu = false;
this.arianeService.navigateSeriesEdit(this.arianeSeriesId, event.which === 2);
}
onSubEditUniverse(event: any): void {
console.log('onSubEdit()');
this.displayEditMenu = false;
this.displayUserMenu = false;
this.arianeService.navigateUniverseEdit(this.arianeUniverseId, event.which === 2);
}
onSubEditType(event: any): void {
console.log('onSubEditType()');
this.displayEditMenu = false;
this.displayUserMenu = false;
this.arianeService.navigateTypeEdit(this.arianeTypeId, event.which === 2);
}
onAddMedia(event: any): void {
console.log('onAddMedia()');
this.router.navigate([ 'upload' ]);
this.displayUserMenu = false;
}
}

View File

@ -0,0 +1,8 @@
import { Media, isMedia } from "./media";
import { NodeData, isNodeData } from "./node";
export {
NodeData, isNodeData,
Media, isMedia,
}

View File

@ -0,0 +1,51 @@
import { isObject, isNumberFinite, isString, isOptionalOf, isOptionalArrayOf } from "../utils";
import { isNodeData, NodeData } from "./node";
export interface Media extends NodeData {
dataId?: number;
typeId?: number;
universeId?: number;
seriesId?: number;
seasonId?: number;
episode?: number;
date?: number;
time?: number;
ageLimit?: string;
};
export function isMedia(data: any): data is Media {
if (!isNodeData(data) as any) {
return false;
}
if (!isOptionalOf(data.dataId, isNumberFinite)) {
return false;
}
if (!isOptionalOf(data.typeId, isNumberFinite)) {
return false;
}
if (!isOptionalOf(data.universeId, isNumberFinite)) {
return false;
}
if (!isOptionalOf(data.seriesId, isNumberFinite)) {
return false;
}
if (!isOptionalOf(data.seasonId, isNumberFinite)) {
return false;
}
if (!isOptionalOf(data.episode, isNumberFinite)) {
return false;
}
if (!isOptionalOf(data.date, isNumberFinite)) {
return false;
}
if (!isOptionalOf(data.time, isNumberFinite)) {
return false;
}
if (!isOptionalOf(data.ageLimit, isString)) {
return false;
}
return true;
}

View File

@ -0,0 +1,34 @@
import { isArrayOf, isNumberFinite, isObject, isOptionalOf, isOptionalArrayOf, isString } from "../utils";
export interface NodeData {
id: number;
name: string;
description?: string;
parentId?: number;
covers?: number[];
};
export function isNodeData(data: any): data is NodeData {
if (!isObject(data)) {
return false;
}
if (!isNumberFinite(data.id)) {
return false;
}
if (!isString(data.name)) {
return false;
}
if (!isOptionalOf(data.description, isString)) {
return false;
}
if (!isOptionalOf(data.parentId, isNumberFinite)) {
return false;
}
if (!isOptionalArrayOf(data.cover, isNumberFinite)) {
return false;
}
return true;
}

View File

@ -6,7 +6,7 @@
import { Injectable, Component, OnInit, Input, Output, EventEmitter } from '@angular/core';
import { PopInService } from '../../service/popin';
import { PopInService } from '../../service';
@Component({
selector: 'delete-confirm',

View File

@ -7,7 +7,7 @@
import { Injectable, Component, OnInit, Input, SimpleChanges } from '@angular/core';
import { Router } from '@angular/router';
import { PopInService } from '../../service/popin';
import { PopInService } from '../../service';
@Component({
selector: 'upload-progress',

View File

@ -1,3 +1,9 @@
<p>
help works!
</p>
<div class="generic-page">
<div class="title">
Karauth (SSO identity manager) Help area.
</div>
<div class="fill-all colomn_mutiple">
Help
<div class="clear"></div>
</div>
</div>

View File

@ -0,0 +1,70 @@
.title {
//background-color: green;
font-size: 45px;
font-weight: bold;
line-height: 60px;
width:100%;
align: left;
text-align: center;
vertical-align: middle;
margin: 10px 0 10px 0;
text-shadow: 1px 1px 2px white, 0 0 1em white, 0 0 0.2em white;
text-transform: uppercase;
font-family: "Roboto","Helvetica","Arial",sans-serif;
}
.item-home {
background-color: rgba(200, 200, 200, 0.5);
font-size: 20px;
height: 190px;
width: 200px;
margin: 5px;
padding: 0;
overflow: hidden;
// box-shadow: 0 1px 1.5px 0 rgba(0,0,0,.12),0 1px 1px 0 rgba(0,0,0,.24);
box-shadow: 0px 2px 4px 0 rgba(0, 0, 0, 0.6);
line-height: normal;
border: none;
font-family: "Roboto","Helvetica","Arial","sans-serif";
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0;
will-change: box-shadow;
outline: none;
cursor: pointer;
text-decoration: none;
text-align: center;
vertical-align: middle;
transition-duration: 0.4s;
float:left;
display:block;
h1 {
font-size: 24px;
}
&:hover {
background-color: rgba(200, 200, 200, 1);
//box-shadow: 0px 2px 4px 0 rgba(255, 0, 0, 0.6);
}
.material-icons {
vertical-align: middle;
}
.material-icons {
position: absolute;
top: 50%;
left: 50%;
transform: ~"translate(-12px,-12px)";
line-height: 24px;
width: 24px;
}
}
@media all and (min-width: 1310px) {
.colomn_mutiple {
width: ~"calc(210px * 5)";
margin: auto;
}
}

View File

@ -14,10 +14,25 @@ import { ArianeService } from '../../service/ariane';
styleUrls: [ './help.less' ]
})
export class HelpScene implements OnInit {
page = '';
constructor(private route: ActivatedRoute,
private arianeService: ArianeService) { }
ngOnInit() {
this.arianeService.updateManual(this.route.snapshot.paramMap);
const page = this.route.snapshot.paramMap.get('page');
if (page == null) {
this.page = undefined;
} else {
this.page = page;
}
console.error(`MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM`);
console.error(`get parameter update: ${this.page}`);
console.error(`MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM`);
}
onSelectType(_event: any, _idSelected: number):void {
}
}

View File

@ -0,0 +1,34 @@
import { ErrorViewerScene } from "./error-viewer/error-viewer";
import { HelpScene } from "./help/help";
import { HomeScene } from "./home/home";
import { SeasonEditScene } from "./season-edit/season-edit";
import { SeasonScene } from "./season/season";
import { SeriesEditScene } from "./series-edit/series-edit";
import { SeriesScene } from "./series/series";
import { SettingsScene } from "./settings/settings";
import { SsoScene } from "./sso/sso";
import { TypeScene } from "./type/type";
import { UniverseScene } from "./universe/universe";
import { UploadScene } from "./upload/upload";
import { VideoEditScene } from "./video-edit/video-edit";
import { VideoScene } from "./video/video";
export {
ErrorViewerScene,
HelpScene,
HomeScene,
SsoScene,
SettingsScene,
SeasonScene,
SeasonEditScene,
SeriesScene,
SeriesEditScene,
TypeScene,
UniverseScene,
UploadScene,
VideoScene,
VideoEditScene,
};

View File

@ -1,46 +0,0 @@
<div class="full">
<div class="color-background-vignette container-global">
<div class="imgContainer">
<img src="assets/images/avatar_generic.svg" alt="Avatar" class="avatar"/>
</div>
<div class="container">
<label for="login_field"><b>{{loginType}}</b></label>
<input id="username"
name="username"
type="text"
required=""
placeholder="Enter Username/e-mail"
[value]="login"
(input)="checkLogin($event.target.value)"
/>
<div class="error color-shadow-black" *ngIf="loginHelp">{{loginHelp}}</div>
<label for="password"><b>Password</b></label> <a class="forgot" href="#">Forgot password?</a>
<input type="password"
id="password"
name="password"
placeholder="Enter Password"
required=""
[value]="password"
(input)="checkPassword($event.target.value)"
/>
<div class="error color-shadow-black" *ngIf="passHelp">{{passHelp}}</div>
<label class="container-checkbox">
Remember me
<input type="checkbox" ng-model="rememberMe"/>
<span class="checkmark"></span>
</label>
</div>
<div class="container">
<button class="button cancel color-button-cancel color-shadow-black"
(click)="onCancel()">Cancel</button>
<button class="button login color-button-validate color-shadow-black"
id="login-button"
[disabled]="loginButtonDisabled"
(click)="onLogin()"
type="submit">Login</button>
</div>
<div class="container">
{{error}}
</div>
</div>
</div>

View File

@ -1,169 +0,0 @@
/** @file
* @author Edouard DUPIN
* @copyright 2018, Edouard DUPIN, all right reserved
* @license PROPRIETARY (see license file)
*/
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { Router } from '@angular/router';
import { Location } from '@angular/common';
import { UserService } from '../../service/user';
import { SessionService } from '../../service/session';
import { CookiesService } from '../../service/cookies';
import { ArianeService } from '../../service/ariane';
export function checkLoginValidity(value:string):boolean {
let regexCheck = new RegExp('^[a-zA-Z0-9_\\.-]+$');
if(regexCheck.test(value)) {
return true;
}
return false;
}
export function checkEmailValidity(value:string):boolean {
let regexCheck = new RegExp('^[a-zA-Z0-9_\\.@-]+@[a-zA-Z0-9_\\.-]+\\.[a-zA-Z]+$');
if(regexCheck.test(value)) {
return true;
}
return false;
}
export function checkPasswordValidity(value:string):boolean {
let regexCheck = new RegExp('^[a-zA-Z0-9_\\.@ %:;,=}{\\?\\!\\*\\+\\(\\)\\[\\]\\|&#%~/\\\\\\<\\>-£€]+$');
if(regexCheck.test(value)) {
return true;
}
return false;
}
declare function SHA512(param1: any): any;
@Component({
selector: 'app-login',
templateUrl: './login.html',
styleUrls: [ './login.less' ]
})
export class LoginScene implements OnInit {
public loginOK:boolean = false;
public loginHelp:string = '';
public login:string = '';
public passOK:boolean = false;
public passHelp:string = '';
public password:string = '';
public loginButtonDisabled:boolean = true;
public error:string = '';
public loginType:string = 'Username/E-mail';
public rememberMe:boolean = true;
constructor(private router: Router,
private route: ActivatedRoute,
private locate: Location,
private cookiesService: CookiesService,
private userService: UserService,
private sessionService: SessionService,
private arianeService: ArianeService) {
}
ngOnInit() {
// If already loaded ==> jusp in the home page ...
this.arianeService.updateManual(this.route.snapshot.paramMap);
}
updateButtonVisibility():void {
if(this.loginOK === true &&
this.passOK === true) {
this.loginButtonDisabled = false;
} else {
this.loginButtonDisabled = true;
}
this.error = '';
}
/**
* Check the login writing rules
*/
checkLogin(newValue:string):void {
this.login = newValue;
if(this.login === null) {
this.loginOK = false;
this.loginHelp = '';
this.updateButtonVisibility();
return;
}
if(this.login.length < 6) {
this.loginOK = false;
this.loginHelp = 'Need 6 characters';
this.loginType = 'Username/E-mail';
this.updateButtonVisibility();
return;
}
if(checkLoginValidity(this.login) === true) {
this.loginOK = true;
this.loginHelp = '';
this.loginType = 'Username';
} else if(checkEmailValidity(this.login) === true) {
this.loginOK = true;
this.loginHelp = '';
this.loginType = 'E-mail';
} else {
this.loginOK = false;
this.loginHelp = 'Not valid: characters, numbers, "_-." and email format: you@example.com';
}
this.updateButtonVisibility();
}
/**
* Check the password writing rules
*/
checkPassword(newValue:string):void {
this.password = newValue;
if(this.password === null) {
this.passOK = false;
this.passHelp = '';
this.updateButtonVisibility();
return;
}
if(this.password.length < 6) {
this.passOK = false;
this.passHelp = 'Need 6 characters';
} else if(checkPasswordValidity(this.password) === true) {
this.passOK = true;
this.passHelp = '';
} else {
this.passOK = false;
this.passHelp = 'Not valid: characters, numbers and "_-:;.,?!*+=}{([|)]% @&~#/\\<>"';
}
this.updateButtonVisibility();
}
onLogin():void {
this.sessionService.destroy();
let self = this;
this.userService.login(this.login, this.password)
.then((response) => {
self.error = 'Login ...';
self.sessionService.create(response.sessionId,
response.login,
response.email,
response.role,
response.avatar);
if(self.rememberMe === true) {
self.cookiesService.set('yota-login', response.login, 120);
self.cookiesService.set('yota-password', SHA512(self.password), 60);
}
self.router.navigate([ 'home' ]);
}).catch((response) => {
self.error = 'Wrong e-mail/login or password';
});
}
onCancel():void {
console.log(`onCancel ... '${ this.login }':'${ this.password }'`);
this.locate.back();
}
}

View File

@ -41,6 +41,7 @@ export class SeasonScene implements OnInit {
let self = this;
this.seasonService.get(this.idSeason)
.then((response:any) => {
console.log("Get element ! " + JSON.stringify(response));
self.name = response.name;
self.seriesId = response.parentId;
self.description = response.description;

View File

@ -45,8 +45,8 @@ export class SeriesEditScene implements OnInit {
uploadFileValue:string = '';
selectedFiles:FileList;
seasonsCount:string = null;
videoCount:string = null;
seasonsCount: string = null;
videoCount: string = null;
coversDisplay:Array<any> = [];
// section tha define the upload value to display in the pop-in of upload
@ -124,15 +124,15 @@ export class SeriesEditScene implements OnInit {
self.itemIsLoading = false;
});
console.log(`get parameter id: ${ this.idSeries}`);
this.seriesService.getSeason(this.idSeries, [ 'id', 'name' ])
this.seriesService.getSeason(this.idSeries)
.then((response) => {
self.seasonsCount = response.length;
self.seasonsCount = "" + response.length;
}).catch((response) => {
self.seasonsCount = '---';
});
this.seriesService.getVideo(this.idSeries)
.then((response) => {
self.videoCount = response.length;
self.videoCount = "" + response.length;
}).catch((response) => {
self.videoCount = '---';
});

View File

@ -9,6 +9,7 @@ import { ActivatedRoute } from '@angular/router';
import { SeriesService } from '../../service/series';
import { ArianeService } from '../../service/ariane';
import { NodeData } from '../../model';
@Component({
selector: 'app-series',
@ -23,7 +24,7 @@ export class SeriesScene implements OnInit {
cover: string = '';
covers: Array<string> = [];
seasonsError: string = '';
seasons: Array<any> = [];
seasons: NodeData[] = [];
videosError: string = '';
videos: Array<any> = [];
constructor(private route: ActivatedRoute,
@ -65,9 +66,10 @@ export class SeriesScene implements OnInit {
self.covers = [];
// no check just ==> an error occured on season
});
console.log(`get parameter id: ${ this.idSeries}`);
this.seriesService.getSeason(this.idSeries, [ 'id', 'name' ])
.then((response) => {
//console.log(`get parameter id: ${ this.idSeries}`);
this.seriesService.getSeason(this.idSeries)
.then((response: NodeData[]) => {
//console.log(`>>>> get season : ${JSON.stringify(response)}`)
self.seasonsError = '';
self.seasons = response;
updateEnded.subSaison = true;
@ -79,7 +81,8 @@ export class SeriesScene implements OnInit {
self.checkIfJumpIsNeeded(updateEnded);
});
this.seriesService.getVideo(this.idSeries)
.then((response) => {
.then((response: NodeData[]) => {
//console.log(`>>>> get video : ${JSON.stringify(response)}`)
self.videosError = '';
self.videos = response;
updateEnded.subVideo = true;

View File

@ -1,3 +1,9 @@
<p>
settings works!
</p>
<div class="generic-page">
<div class="title">
Karauth (SSO identity manager)
</div>
<div class="fill-all colomn_mutiple">
Global settings.
<div class="clear"></div>
</div>
</div>

View File

@ -0,0 +1,70 @@
.title {
//background-color: green;
font-size: 45px;
font-weight: bold;
line-height: 60px;
width:100%;
align: left;
text-align: center;
vertical-align: middle;
margin: 10px 0 10px 0;
text-shadow: 1px 1px 2px white, 0 0 1em white, 0 0 0.2em white;
text-transform: uppercase;
font-family: "Roboto","Helvetica","Arial",sans-serif;
}
.item-home {
background-color: rgba(200, 200, 200, 0.5);
font-size: 20px;
height: 190px;
width: 200px;
margin: 5px;
padding: 0;
overflow: hidden;
// box-shadow: 0 1px 1.5px 0 rgba(0,0,0,.12),0 1px 1px 0 rgba(0,0,0,.24);
box-shadow: 0px 2px 4px 0 rgba(0, 0, 0, 0.6);
line-height: normal;
border: none;
font-family: "Roboto","Helvetica","Arial","sans-serif";
font-weight: 500;
text-transform: uppercase;
letter-spacing: 0;
will-change: box-shadow;
outline: none;
cursor: pointer;
text-decoration: none;
text-align: center;
vertical-align: middle;
transition-duration: 0.4s;
float:left;
display:block;
h1 {
font-size: 24px;
}
&:hover {
background-color: rgba(200, 200, 200, 1);
//box-shadow: 0px 2px 4px 0 rgba(255, 0, 0, 0.6);
}
.material-icons {
vertical-align: middle;
}
.material-icons {
position: absolute;
top: 50%;
left: 50%;
transform: ~"translate(-12px,-12px)";
line-height: 24px;
width: 24px;
}
}
@media all and (min-width: 1310px) {
.colomn_mutiple {
width: ~"calc(210px * 5)";
margin: auto;
}
}

View File

@ -14,10 +14,25 @@ import { ArianeService } from '../../service/ariane';
styleUrls: [ './settings.less' ]
})
export class SettingsScene implements OnInit {
page = '';
constructor(private route: ActivatedRoute,
private arianeService: ArianeService) { }
ngOnInit() {
this.arianeService.updateManual(this.route.snapshot.paramMap);
const page = this.route.snapshot.paramMap.get('page');
if (page == null) {
this.page = undefined;
} else {
this.page = page;
}
console.error(`MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM`);
console.error(`get parameter update: ${this.page}`);
console.error(`MMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMMM`);
}
onSelectType(_event: any, _idSelected: number):void {
}
}

View File

@ -1,63 +0,0 @@
<div class="left">
<div class="global-help">
<div class="comment"><label class="unselectable">Rate and comment your medias</label></div>
<div class="share"><label class="unselectable">Shared personal media at home</label></div>
<div class="time"><label>Keep last view position</label></div>
</div>
</div>
<div class="right">
<div class="modal-content color-background-vignette container-global">
<div class="logo">
</div>
<div class="container">
<label for="login_field" ><b>Login</b></label>
<input id="username"
name="username"
class="{{loginIcon}}"
type="text"
required=""
placeholder="Pick a Username"
[value]="login"
(input)="checkLogin($event.target.value)"
/>
<div class="error color-shadow-black" *ngIf="loginHelp">{{loginHelp}}</div>
<label for="login_field" ><b>E-mail</b></label>
<input id="email"
name="e-mail"
class="{{emailIcon}}"
type="text"
required=""
placeholder="you@example.com"
[value]="email"
(input)="checkEmail($event.target.value)"
/>
<div class="error color-shadow-black" *ngIf="emailHelp">{{emailHelp}}</div>
<label for="password"><b>Password</b></label>
<input type="password"
id="password"
name="password"
class="{{passIcon}}"
placeholder="Enter Password"
required=""
[value]="password"
(input)="checkPassword($event.target.value)"
/>
<div class="error color-shadow-black" *ngIf="passHelp">{{passHelp}}</div>
</div>
<div class="container">
<button class="button fill-x color-button-validate color-shadow-black" id="onSignUp-button" [disabled]="signUpButtonDisabled" (click)="onSignUp()" type="submit"><i class="material-icons">mode_edit</i> Sign up for Karideo</button>
</div>
<div class="container commmon-policy">
By clicking "Sign up for Karideo", you agree to our <a class="" href="https://help.karideo.com/terms" target="_blank">terms of service</a> and <a class="" href="https://help.karideo.com/privacy" target="_blank">privacy policy</a>.<br/>
Well occasionally send you account related emails.
</div>
<div class="container">
<a class="forgot" href="#">Forgot password?</a>
</div>
<div class="container">
{{error}}
</div>
</div>
</div>

View File

@ -1,162 +0,0 @@
.right{
width:50%;
height:100%;
right:0;
margin:0;
padding:0;
border:0;
float:right;
display:block;
}
.left{
width:50%;
height:100%;
left:0;
margin:0;
padding:0;
border:0;
float:left;
display:block;
color: white;
.comment {
background-image: url("../../../assets/images/comments.svg");
background-repeat: no-repeat;
background-size: 45px;
/*background-attachment: fixed;*/
background-position: 0% 50%;
padding: 0 0 0 58px;
margin: 17px 0 17px 0;
text-shadow:0px 0px 4px #2b3137;
}
.share {
background-image: url("../../../assets/images/share.svg");
background-repeat: no-repeat;
background-size: 45px;
/*background-attachment: fixed;*/
background-position: 0% 50%;
padding: 0 0 0 58px;
margin: 17px 0 17px 0;
text-shadow:0px 0px 4px #2b3137;
}
.time {
background-image: url("../../../assets/images/time.svg");
background-repeat: no-repeat;
background-size: 45px;
/*background-attachment: fixed;*/
background-position: 0% 50%;
padding: 0 0 0 58px;
margin: 17px 0 17px 0;
text-shadow:0px 0px 4px #2b3137;
}
}
input[type=text], input[type=password] {
width: 100%;
padding: 12px 35px 12px 15px;
margin: 8px 0;
display: inline-block;
border: 1px solid #ccc;
box-sizing: border-box;
}
.global-help {
position:relative;
max-width:500px;
padding: 16px 32px 16px 32px;
top: 50%;
left: 50%;
transform: ~"translate(-50%, -50%)";
font-size: 30px;
font-weight: 600;
text-align: left;
line-height: 200%;
}
.container-global {
position:relative;
max-width:400px;
padding: 16px 32px 16px 32px;
top: 50%;
left: 50%;
transform: ~"translate(-50%, -50%)";
box-shadow: 0px 8px 20px 0 rgba(0, 0, 0, 0.9);
}
.container {
padding: 16px 0 0 0;
}
span.psw {
float: right;
padding-top: 16px;
}
.help {
color: #E44;
font-size: 14px;
}
.forgot {
color: #00B;
font-size: 14px;
float: right;
buttum: 0;
line-height: 24px;
}
.commmon-policy {
font-size: 13px;
font-weight: 300;
text-align: center;
}
.icon-right-load {
background: white url("../../../assets/images/load.svg") right no-repeat;
background-size: 35px;
padding-right: 17px;
}
.icon-right-validate {
background: white url("../../../assets/images/validate.svg") right no-repeat;
background-size: 35px;
padding-right: 17px;
}
.icon-right-not-validate {
background: white url("../../../assets/images/validate-not.svg") right no-repeat;
background-size: 35px;
padding-right: 17px;
}
.error {
background-color: #f44336;
position: absolute;
z-index: 10;
display: block;
max-width: 450px;
padding: 5px 8px;
margin: 2px 0 0;
font-size: 16px;
font-weight: 400;
border-style: solid;
border-width: 0px;
box-sizing: border-box;
&:after, &:before {
bottom: 100%;
left: 25px;
border: solid transparent;
content: " ";
height: 0;
width: 0;
position: absolute;
pointer-events: none;
}
&:after {
border-bottom-color: #f44336;
border-width: 10px;
margin-left: -10px;
}
}

View File

@ -1,231 +0,0 @@
/** @file
* @author Edouard DUPIN
* @copyright 2018, Edouard DUPIN, all right reserved
* @license PROPRIETARY (see license file)
*/
import { Component, OnInit } from '@angular/core';
import { Router, ActivatedRoute } from '@angular/router';
import { checkLoginValidity, checkEmailValidity, checkPasswordValidity } from '../login/login';
import { UserService } from '../../service/user';
import { ArianeService } from '../../service/ariane';
@Component({
selector: 'app-sign-up',
templateUrl: './sign-up.html',
styleUrls: [ './sign-up.less' ]
})
export class SignUpScene implements OnInit {
private signUpIconWrong:string = 'icon-right-not-validate';
private signUpIconWait:string = 'icon-right-load';
private signUpIconRight:string = 'icon-right-validate';
public login:string = '';
public loginOK:boolean = false;
public loginHelp:string = '';
public loginIcon:string = '';
public email:string = '';
public emailOK:boolean = false;
public emailHelp:string = '';
public emailIcon:string = '';
public password:string = '';
public passOK:boolean = false;
public passHelp:string = '';
public passIcon:string = '';
public signUpButtonDisabled:boolean = true;
public error:string = '';
public rememberMe:boolean = true;
constructor(private userService: UserService,
private router: Router,
private route: ActivatedRoute,
private arianeService: ArianeService) {
}
ngOnInit() {
this.arianeService.updateManual(this.route.snapshot.paramMap);
}
updateButtonVisibility():void {
if(this.loginOK === true &&
this.passOK === true &&
this.emailOK === true) {
this.signUpButtonDisabled = false;
} else {
this.signUpButtonDisabled = true;
}
this.error = '';
}
checkLogin(newValue:string):void {
// this.userService.loginSha("loooogin", "ekljkj", true);
this.login = newValue;
if(this.login === null ||
this.login.length === 0) {
this.loginOK = false;
this.loginIcon = '';
this.loginHelp = '';
this.updateButtonVisibility();
return;
}
if(this.login.length < 6) {
this.loginOK = false;
this.loginHelp = 'Need 6 characters';
this.loginIcon = '';
this.updateButtonVisibility();
return;
}
if(checkLoginValidity(this.login) === true) {
this.loginOK = false;
// this.loginHelp = "check in progress...";
this.loginIcon = this.signUpIconWait;
let self = this;
this.userService.checkLogin(this.login).then(() => {
// check if the answer is correct with the question
if(newValue !== self.login) {
return;
}
// the login exist ... ==> it is found...
self.loginOK = false;
self.loginHelp = 'Login already used ...';
self.loginIcon = self.signUpIconWrong;
self.updateButtonVisibility();
}, (error: number) => {
console.log(`1 ${ self}`);
// check if the answer is correct with the question
if(newValue !== self.login) {
return;
}
if(error === 404) {
self.loginOK = true;
self.loginHelp = '';
self.loginIcon = self.signUpIconRight;
self.updateButtonVisibility();
return;
}
console.log(`Status ${ error}`);
self.loginOK = false;
self.loginHelp = 'Login already used ...';
self.loginIcon = self.signUpIconWrong;
self.updateButtonVisibility();
});
} else {
this.loginOK = false;
this.loginHelp = 'Not valid: characters, numbers and "_-."';
}
this.updateButtonVisibility();
}
checkEmail(newValue:string):void {
this.email = newValue;
if(this.email === null ||
this.email.length === 0) {
this.emailOK = false;
this.updateButtonVisibility();
this.emailIcon = '';
this.emailHelp = '';
return;
}
if(this.email.length < 6) {
this.emailOK = false;
this.emailHelp = 'Need 6 characters';
this.updateButtonVisibility();
this.passIcon = '';
return;
}
if(checkEmailValidity(this.email) === true) {
this.emailOK = false;
this.emailHelp = '';
// this.loginHelp = "check in progress...";
this.emailIcon = this.signUpIconWait;
let self = this;
this.userService.checkEMail(this.email).then(() => {
// check if the answer is correct with the question
if(newValue !== self.email) {
return;
}
// the email exist ... ==> it is found...
self.emailOK = false;
self.emailHelp = 'email already used ...';
self.emailIcon = self.signUpIconWrong;
self.updateButtonVisibility();
}, (error: number) => {
// check if the answer is correct with the question
if(newValue !== self.email) {
return;
}
if(error === 404) {
self.emailOK = true;
self.emailHelp = '';
self.emailIcon = self.signUpIconRight;
self.updateButtonVisibility();
return;
}
console.log(`Status ${ error}`);
self.emailOK = false;
self.emailHelp = 'email already used ...';
self.emailIcon = self.signUpIconWrong;
self.updateButtonVisibility();
});
} else {
this.emailOK = false;
this.emailHelp = 'Not valid: characters, numbers, "_-." and email format: you@example.com';
}
this.updateButtonVisibility();
}
checkPassword(newValue:string):void {
this.password = newValue;
console.log(`ooooooooooooooo ${ this.password}`);
if(this.password === null) {
this.passOK = false;
this.passHelp = '';
this.updateButtonVisibility();
return;
}
if(this.password.length < 6) {
this.passOK = false;
this.passHelp = 'Need 6 characters';
} else if(checkPasswordValidity(this.password) === true) {
this.passOK = true;
this.passHelp = '';
} else {
this.passOK = false;
this.passHelp = 'Not valid: characters, numbers and "_-:;.,?!*+=}{([|)]% @&~#/\\<>"';
}
this.updateButtonVisibility();
}
onSignUp():void {
console.log('Validate ... ');
if(this.signUpButtonDisabled === true) {
// ... notify user ...
console.log('Not permited action ... ==> control does not validate this action ...');
return;
}
let self = this;
// disable the currect button
this.signUpButtonDisabled = true;
this.userService.create(this.login, this.email, this.password).then(
(value) => {
console.log('User created');
self.router.navigate([ 'login' ]);
// send a generic message in the pop-up enevts... self.emailHelp = "email already used ... (error 2)";
}, (value) => {
console.log('User NOT created');
// send a generic message in the pop-up enevts... self.emailHelp = "email already used ... (error 2)";
});
}
onCancel():void {
console.log(`onCancel ... '${ this.login }':'${ this.password }'`);
// $rootScope.currentModal = "";
}
}

View File

@ -0,0 +1,28 @@
<div class="full">
<div class="color-background-vignette container-global">
<div class="containerCenter">
<label for="login_field"><b>LOGIN (after SSO)</b></label>
</div>
<div class="imgContainer">
<img src="assets/images/avatar_generic.svg" alt="Avatar" class="avatar"/>
</div>
<div class="container" *ngIf="token === '__CANCEL__'">
<label for="login_field"><b>ERROR: </b> Request cancel of connection !</label>
</div>
<div class="container" *ngIf="token === '__FAIL__'">
<label for="login_field"><b>ERROR: </b> Connection FAIL !</label>
</div>
<div class="container" *ngIf="token === '__LOGOUT__'">
<label for="login_field"><b>Dis-connected: </b> Redirect soon! </label>
</div>
<div class="container" *ngIf="token === 'ERROR_ME'">
<label for="login_field"><b>ERROR: </b> can not retreive user local informations!</label>
</div>
<div class="container" *ngIf="token !== 'ERROR_ME' and token !== '__FAIL__' and token !== '__CANCEL__' and token === '__LOGOUT__'">
<label for="login_field"><b>Connected: </b> Redirect soon!</label>
</div>
<div class="container" *ngIf="token !== 'ERROR_ME' and token !== '__FAIL__' and token !== '__CANCEL__' and token === '__LOGOUT__'">
<label for="login_field"><b>Welcome back: </b> {{userName}}</label>
</div>
</div>
</div>

View File

@ -28,6 +28,11 @@ input[type=text], input[type=password] {
margin: 2% 2%;
width: 45%;
}
.containerCenter {
text-align: center;
margin: 15px 0 0 0;
}
.imgContainer {
text-align: center;

View File

@ -0,0 +1,86 @@
/** @file
* @author Edouard DUPIN
* @copyright 2018, Edouard DUPIN, all right reserved
* @license PROPRIETARY (see license file)
*/
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute, Router } from '@angular/router';
import { SSOService, UserService } from '../../service';
@Component({
selector: 'app-sso',
templateUrl: './sso.html',
styleUrls: [ './sso.less' ]
})
export class SsoScene implements OnInit {
ssoData: string;
token: string;
keepConnected: boolean
userName: string
constructor(
private router: Router,
private route: ActivatedRoute,
private ssoService: SSOService,
private userService: UserService) {
console.error("retreive data after SSO");
}
ngOnInit() {
let self = this;
console.error("retreive data after SSO ng-init");
const ssoData = this.route.snapshot.paramMap.get('data');
if (ssoData == null) {
this.ssoData = undefined;
} else {
this.ssoData = ssoData;
}
const token = this.route.snapshot.paramMap.get('token');
if (token == null) {
this.token = undefined;
} else {
this.token = token;
}
const keepConnected = this.route.snapshot.paramMap.get('keepConnected');
if (keepConnected == null) {
this.keepConnected = undefined;
} else {
this.keepConnected = keepConnected === 'true';
}
console.error(`ssoData: '${ssoData}'`);
console.error(`token: '${token}'`);
console.error(`keepConnected: '${keepConnected}'`);
if (this.token !== '__CANCEL__' && this.token !== '__FAIL__' && this.token !== '__LOGOUT__') {
const destination = (this.ssoData);
console.error(`ssoData (decoded): '${destination}'`);
// sample : ZZ**DST:home
const realDst = this.ssoService.unHashLocalData(destination);
console.error(`realDst: '${realDst}'`);
this.userService.startSession(this.token, this.keepConnected).then((userName: string) => {
self.userName = userName;
setTimeout(function(){
self.router.navigate([ realDst ], { replaceUrl:true });
}, 2000); // 2 seconds
}).catch(() => {
this.token = "ERROR_ME";
})
} else if (this.token === '__LOGOUT__') {
this.userService.removeSession();
const destination = (this.ssoData);
console.error(`ssoData (decoded): '${destination}'`);
// sample : ZZ**DST:home
const realDst = this.ssoService.unHashLocalData(destination);
console.error(`realDst: '${realDst}'`);
setTimeout(function(){
self.router.navigate([ realDst ], { replaceUrl:true });
}, 2000); // 2 seconds
} else {
this.userService.removeSession();
}
}
}

View File

@ -65,7 +65,7 @@ export class TypeScene implements OnInit {
self.covers = [];
self.cover = null;
});
this.typeService.getSubSeries(this.typeId, [ 'id', 'name' ])
this.typeService.getSubSeries(this.typeId)
.then((response) => {
console.log(` ==> get answer sub-series: ${JSON.stringify(response)}`);
self.seriessError = '';
@ -75,7 +75,7 @@ export class TypeScene implements OnInit {
self.seriessError = 'Wrong e-mail/login or password';
self.seriess = [];
});
this.typeService.getSubVideo(this.typeId, [ 'id', 'name' ])
this.typeService.getSubVideo(this.typeId)
.then((response) => {
console.log(` ==> get answer sub-video: ${JSON.stringify(response)}`);
self.videosError = '';

View File

@ -175,7 +175,7 @@ export class UploadScene implements OnInit {
let self = this;
this.updateNeedSend();
if(this.typeId !== null) {
self.typeService.getSubSeries(this.typeId, [ 'id', 'name' ])
self.typeService.getSubSeries(this.typeId)
.then((response2) => {
for(let iii = 0; iii < response2.length; iii++) {
self.listSeries.push({ value: response2[iii].id, label: response2[iii].name });
@ -573,7 +573,7 @@ export class UploadScene implements OnInit {
self.saisonId = null;
// set 1 find the ID of the season:
this.seriesService.getSeason(this.seriesId, [ 'id', 'name' ])
this.seriesService.getSeason(this.seriesId)
.then((response: any[]) => {
// console.log("find season: " + response.length);
for(let iii = 0; iii < response.length; iii++) {

View File

@ -1,14 +0,0 @@
<div class="sign" ng-controller="controlerValidateEmail">
<div class="full-back">
<div class="global-help">
<i class="material-icons big-one">email</i>
<div>Waiting email validation ...</div>
</div>
</div>
<button class="button sender color-button-validate color-shadow-light" ng-disabled="syncButtonDisabled" (click)="onSend()">
<i class="material-icons">send</i> re-send the validation code.
</button>
<button class="button last-update color-button-normal color-shadow-light" ng-disabled="sendButtonDisabled" (click)="onCheck()">
<i class="material-icons">loop</i> 18h15
</button>
</div>

View File

@ -1,122 +0,0 @@
sign {
.full-back{
position:absolute;
width:100%;
height:100%;
right:100;
background-color:#2b3137;
background-image: url("../../../assets/images/ikon_gray.svg");
background-repeat: no-repeat;
/*
background-size: contain;
*/
background-size: 80%;
background-attachment: fixed;
background-position: 50% 50%;
z-index:-1;
}
.left{
width:50%;
height:100%;
left:0;
margin:0;
padding:0;
border:0;
float:left;
display:block;
color: white;
.comment {
background-image: url("../../../assets/images/comments.svg");
background-repeat: no-repeat;
background-size: 45px;
background-attachment: fixed;
background-position: 0% 50%;
padding: 0 0 0 58px;
margin: 17px 0 17px 0;
text-shadow:0px 0px 4px #2b3137;
}
.share {
background-image: url("../../../assets/images/share.svg");
background-repeat: no-repeat;
background-size: 45px;
background-attachment: fixed;
background-position: 0% 50%;
padding: 0 0 0 58px;
margin: 17px 0 17px 0;
text-shadow:0px 0px 4px #2b3137;
}
.forget {
background-image: url("../../../assets/images/erase.svg");
background-repeat: no-repeat;
background-size: 45px;
background-attachment: fixed;
background-position: 0% 50%;
padding: 0 0 0 58px;
margin: 17px 0 17px 0;
text-shadow:0px 0px 4px #2b3137;
}
.time {
background-image: url("../../../assets/images/time.svg");
background-repeat: no-repeat;
background-size: 45px;
background-attachment: fixed;
background-position: 0% 50%;
padding: 0 0 0 58px;
margin: 17px 0 17px 0;
text-shadow:0px 0px 4px #2b3137;
}
}
.global-help {
color: white;
text-shadow:0px 0px 4px #2b3137;
position:relative;
max-width:500px;
padding: 16px 32px 16px 32px;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
font-size: 30px;
font-weight: 600;
text-align: center;
line-height: 200%;
.big-one {
font-size: 90px;
}
}
.sender {
position: fixed;
display: block;
float: buttom;
top: 80%;
left:50%;
transform: translate(-50%, 0%);
//background-color: #4CAF50;
//padding: 14px 20px;
margin: 1%;
vertical-align: middle;
width:350px;
}
.last-update {
position: fixed;
display: block;
float: buttom;
top: 90%;
left:50%;
transform: translate(-50%, 0%);
//background-color: transparent;
//background-color: #2b3137;
//padding: 14px 20px;
margin: 1%;
vertical-align: middle;
width:350px;
color:white;
}
}

View File

@ -1,260 +0,0 @@
/** @file
* @author Edouard DUPIN
* @copyright 2018, Edouard DUPIN, all right reserved
* @license PROPRIETARY (see license file)
*/
import { Component, OnInit } from '@angular/core';
import { ActivatedRoute } from '@angular/router';
import { ArianeService } from '../../service/ariane';
@Component({
selector: 'app-validate-email',
templateUrl: './validate-email.html',
styleUrls: [ './validate-email.less' ]
})
export class ValidateEmailScene implements OnInit {
constructor(private route: ActivatedRoute,
private arianeService: ArianeService
) {
}
ngOnInit() {
this.arianeService.updateManual(this.route.snapshot.paramMap);
}
onSend() {
}
onCheck() {
}
}
/*
app.controller("controlerValidateEmail", function($scope, $http, $rootScope, AuthService) {
$scope.sendButtonDisabled = false;
$scope.syncButtonDisabled = false;
$scope.error = "";
$scope.rememberMe = true;
$rootScope.currentModalCanRemove = true;
$scope.updateButtonVisibility = function() {
if ( $scope.loginOK == true
&& $scope.passOK == true
&& $scope.emailOK == true) {
$scope.signUpButtonDisabled = false;
} else {
$scope.signUpButtonDisabled = true;
}
$scope.error = "";
}
$scope.checkLogin = function() {
if ( $scope.login == null
|| $scope.login.length == 0) {
$scope.loginOK = false;
$scope.loginIcon = "";
$scope.loginHelp = "";
$scope.updateButtonVisibility();
return;
}
if ($scope.login.length < 6) {
$scope.loginOK = false;
$scope.loginHelp = "Need 6 characters";
$scope.loginIcon = "";
$scope.updateButtonVisibility();
return;
}
if (checkLoginValidity($scope.login) == true) {
$scope.loginOK = false;
//$scope.loginHelp = "check in progress...";
$scope.loginIcon = signUp_iconWait;
let data = {
"login": $scope.login
}
let connectionAdresse = createRESTCall("user/check/login");
let config = {
params: data
};
let tmpLogin = "" + $scope.login;
console.log("call " + connectionAdresse + " data=" + JSON.stringify(data, null, 2));
$http.get(connectionAdresse, config)
.then(function(response) {
// check if the answer is correct with the question
if (tmpLogin !== $scope.login) {
return;
}
console.log("Status " + response.status);
console.log("data " + JSON.stringify(response.data, null, 2));
if (response.status == 200) {
// the login exist ... ==> it is found...
$scope.loginOK = false;
$scope.loginHelp = "Login already used ...";
$scope.loginIcon = signUp_iconWrong;
return;
}
$scope.loginOK = false;
$scope.loginHelp = "Login already used ... (error 2)";
}, function(response) {
// check if the answer is correct with the question
if (tmpLogin !== $scope.login) {
return;
}
if (response.status == 404) {
$scope.loginOK = true;
$scope.loginHelp = "";
$scope.loginIcon = signUp_iconRight;
return;
}
console.log("Status " + response.status);
console.log("data " + JSON.stringify(response.data, null, 2));
$scope.loginOK = false;
$scope.loginHelp = "Login already used ...";
$scope.loginIcon = signUp_iconWrong;
});
} else {
$scope.loginOK = false;
$scope.loginHelp = 'Not valid: characters, numbers and "_-."';
}
$scope.updateButtonVisibility();
}
$scope.checkEmail = function() {
if ( $scope.email == null
|| $scope.email.length == 0) {
$scope.emailOK = false;
$scope.updateButtonVisibility();
$scope.emailIcon = "";
$scope.emailHelp = "";
return;
}
if ($scope.email.length < 6) {
$scope.emailOK = false;
$scope.emailHelp = "Need 6 characters";
$scope.updateButtonVisibility();
$scope.passIcon = "";
return;
}
if (checkEmailValidity($scope.email) == true) {
$scope.emailOK = true;
$scope.emailHelp = "";
//$scope.loginHelp = "check in progress...";
$scope.emailIcon = signUp_iconWait;
let data = {
"e-mail": $scope.email
}
let connectionAdresse = createRESTCall("user/check/email");
let config = {
params: data
};
let tmpEmail = "" + $scope.email;
console.log("call " + connectionAdresse + " data=" + JSON.stringify(data, null, 2));
$http.get(connectionAdresse, config)
.then(function(response) {
// check if the answer is correct with the question
if (tmpEmail !== $scope.email) {
return;
}
console.log("Status " + response.status);
console.log("data " + JSON.stringify(response.data, null, 2));
if (response.status == 200) {
// the email exist ... ==> it is found...
$scope.emailOK = false;
$scope.emailHelp = "email already used ...";
$scope.emailIcon = signUp_iconWrong;
return;
}
$scope.emailOK = false;
$scope.emailHelp = "email already used ... (error 2)";
}, function(response) {
// check if the answer is correct with the question
if (tmpEmail !== $scope.email) {
return;
}
if (response.status == 404) {
$scope.emailOK = true;
$scope.emailHelp = "";
$scope.emailIcon = signUp_iconRight;
return;
}
console.log("Status " + response.status);
console.log("data " + JSON.stringify(response.data, null, 2));
$scope.emailOK = false;
$scope.emailHelp = "email already used ...";
$scope.emailIcon = signUp_iconWrong;
});
} else {
$scope.emailOK = false;
$scope.emailHelp = 'Not valid: characters, numbers, "_-." and email format: you@example.com';
}
$scope.updateButtonVisibility();
}
$scope.checkPassword = function() {
if ($scope.password == null) {
$scope.passOK = false;
$scope.passHelp = "";
$scope.updateButtonVisibility();
return;
}
if ($scope.password.length < 6) {
$scope.passOK = false;
$scope.passHelp = "Need 6 characters";
} else {
if (checkPasswordValidity($scope.password) == true) {
$scope.passOK = true;
$scope.passHelp = "";
} else {
$scope.passOK = false;
$scope.passHelp = 'Not valid: characters, numbers and "_-:;.,?!*+=}{([|)]% @&~#/\<>"';
}
}
$scope.updateButtonVisibility();
}
$scope.onSignUp = function() {
if ($scope.signUpButtonDisabled == true) {
// TODO: ... notify user ...
console.log("Not permited action ... ==> control does not validate this action ...");
return;
}
let data = {
"methode": "v0",
"login": $scope.login,
"e-mail": $scope.email,
"password": btoa(CryptoJS.SHA1($scope.password)) // btoa encode i base64
}
let connectionAdresse = createRESTCall("user/add");
let config = {
headers: {
"Content-Type": "application/json"
}
};
let tmpEmail = "" + $scope.email;
console.log("call " + connectionAdresse + " data=" + JSON.stringify(data, null, 2));
$http.post(connectionAdresse, data, config)
.then(function(response) {
console.log("Status " + response.status);
console.log("data " + JSON.stringify(response.data, null, 2));
if (response.status == 200) {
return;
}
$scope.emailOK = false;
$scope.emailHelp = "email already used ... (error 2)";
}, function(response) {
console.log("Status " + response.status);
console.log("data " + JSON.stringify(response.data, null, 2));
});
}
$scope.onCancel = function() {
console.log("onCancel ... '" + $scope.login + "':'" + $scope.password + "'");
$rootScope.currentModal = "";
}
});
*/

View File

@ -15,6 +15,7 @@ import { SeriesService } from '../../service/series';
import { VideoService } from '../../service/video';
import { ArianeService } from '../../service/ariane';
import { UploadProgress } from '../../popin/upload-progress/upload-progress';
import { NodeData } from '../../model';
export interface ElementList {
value?: number;
@ -248,8 +249,8 @@ export class VideoEditScene implements OnInit {
let self = this;
this.updateNeedSend();
if(this.data.typeId !== undefined) {
self.typeService.getSubSeries(this.data.typeId, [ 'id', 'name' ])
.then((response2) => {
self.typeService.getSubSeries(this.data.typeId)
.then((response2: NodeData[]) => {
for(let iii = 0; iii < response2.length; iii++) {
self.listSeries.push({ value: response2[iii].id, label: response2[iii].name });
}
@ -273,8 +274,8 @@ export class VideoEditScene implements OnInit {
this.listSeason = [ { value: undefined, label: '---' } ];
let self = this;
if(this.data.seriesId !== undefined) {
self.seriesService.getSeason(this.data.seriesId, [ 'id', 'name' ])
.then((response3) => {
self.seriesService.getSeason(this.data.seriesId)
.then((response3: NodeData[]) => {
for(let iii = 0; iii < response3.length; iii++) {
self.listSeason.push({ value: response3[iii].id, label: `season ${ response3[iii].name}` });
}

View File

@ -19,7 +19,7 @@
</div>
<div class="cover-full">
<div class="cover">
<div class="cover-image" *ngIf="cover != null">
<div class="cover-image" *ngIf="cover !== null">
<img src="{{cover}}"/>
</div>
<div class="cover-no-image" *ngIf="cover == null"></div>
@ -29,12 +29,12 @@
</button>
</div>
</div>
<div class="cover-button-next" *ngIf="haveNext != null">
<div class="cover-button-next" *ngIf="haveNext !== null">
<button (click)="onRequireNext($event)" (auxclick)="onRequireNext($event)">
<i class="material-icons big-button">arrow_forward_ios</i>
</button>
</div>
<div class="cover-button-previous" *ngIf="havePrevious != null">
<div class="cover-button-previous" *ngIf="havePrevious !== null">
<button (click)="onRequirePrevious($event)" (auxclick)="onRequirePrevious($event)">
<i class="material-icons big-button">arrow_back_ios</i>
</button>

View File

@ -11,6 +11,7 @@ import { VideoService } from '../../service/video';
import { SeriesService } from '../../service/series';
import { SeasonService } from '../../service/season';
import { ArianeService } from '../../service/ariane';
import { isNullOrUndefined } from '../..//utils';
@Component({
selector: 'app-video',
@ -249,7 +250,7 @@ export class VideoScene implements OnInit {
self.haveNext = null;
self.havePrevious = null;
for(let iii = 0; iii < response6.length; iii++) {
if(response6[iii].episode === undefined || response6[iii].episode === null) {
if(isNullOrUndefined(response6[iii].episode)) {
continue;
}
if(response6[iii].episode < self.episode) {

View File

@ -1,15 +0,0 @@
/** @file
* @author Edouard DUPIN
* @copyright 2018, Edouard DUPIN, all right reserved
* @license PROPRIETARY (see license file)
*/
import { Injectable } from '@angular/core';
@Injectable()
export class AuthService {
constructor() {
}
}

View File

@ -6,7 +6,7 @@
import { Injectable } from '@angular/core';
import { HttpWrapperService } from './http-wrapper';
import { DataInterface, MediaSmall } from './dataInterface';
import { DataInterface } from '../utils/dataInterface';
@Injectable()

View File

@ -4,15 +4,16 @@
* @license PROPRIETARY (see license file)
*/
import { Injectable } from '@angular/core';
import { Injectable } from '@angular/core';
@Injectable()
export class CookiesService {
@Injectable()
export class CookiesService {
constructor() {
}
set(cname, cvalue, exdays) {
set(cname: string, cvalue: string, exdays: number): void {
if(this.get(cname) !== '') {
// reset previous cookies...
document.cookie = `${cname }=;expires=Thu, 01 Jan 1970 00:00:00 GMT;path=/`;
@ -23,11 +24,11 @@ export class CookiesService {
document.cookie = `${cname }=${ cvalue };${ expires };path=/`;
}
remove(cname) {
remove(cname: string) : void {
this.set(cname, '', 0);
}
get(cname) {
get(cname: string) : string | undefined {
let name = `${cname }=`;
let coolies = document.cookie.split(';');
for(let iii = 0; iii < coolies.length; iii++) {
@ -41,5 +42,6 @@ export class CookiesService {
}
return '';
}
}
}

View File

@ -10,6 +10,7 @@ import { HttpClient, HttpHeaders, HttpEventType } from '@angular/common/http';
import { environment } from '../../environments/environment';
import { SessionService } from './session';
import { isNullOrUndefined } from '../utils';
export enum HTTPRequestModel {
POST = "POST",
@ -33,22 +34,13 @@ export interface HTTPRequest {
requestType: HTTPRequestModel ;
accept: HTTPMimeType;
contentType: HTTPMimeType;
params?: any;
params?: object;
body?: any;
authorization?: string; // c'est un hook de merde ...
disableTocken?:boolean;
}
/*
{
endPoint: ,
requestType: HTTPRequestModel.GET,
accept: HTTPMimeType.ALL,
contentType: HTTPMimeType.JSON,
params?: ,
body?: ,
}
*/
export interface ModelResponseHttp{
export interface ModelResponseHttp {
status: number,
data: any,
}
@ -67,7 +59,7 @@ export class HttpWrapperService {
addTokenIfNeeded(headerOption:any): any {
if(this.session.sessionData !== null) {
if(headerOption.Authorization === undefined) {
headerOption.Authorization = `Yota ${ this.session.sessionData.userId }:${ this.session.sessionData.token}`;
headerOption.Authorization = `Yota ${this.session.getToken()}`;
}
}
return headerOption;
@ -79,7 +71,8 @@ export class HttpWrapperService {
let connectionAdresse = this.createRESTCall2({
server: properties.server,
api: properties.endPoint
api: properties.endPoint,
inputOptions: properties.params,
});
let headers: any = {
'Accept': properties.accept,
@ -163,28 +156,33 @@ export class HttpWrapperService {
}
createRESTCall2({ api, server, inputOptions, addURLToken }: { server?: string; api: string; inputOptions?: any[]; addURLToken?:boolean }) {
let basePage = environment.apiUrl;
if (server === "karauth") {
basePage = environment.apiOAuthUrl;
createRESTCall2({ api, server, inputOptions, addURLToken }: { server?: string; api: string; inputOptions?: object; addURLToken?:boolean }) {
if (isNullOrUndefined(server)) {
server = environment.defaultServer;
}
const basePage = environment.server[server];
let addressServerRest = `${basePage }/`;
let options = inputOptions;
if(options === undefined) {
options = [];
if(isNullOrUndefined(options)) {
options = {};
}
let out = addressServerRest + api;
let first = true;
for(let iii = 0; iii < options.length; iii++) {
let keys = Object.keys(options);
for(let iii = 0; iii < keys.length; iii++) {
if(first === false) {
out = `${out }&`;
} else {
out = `${out }?`;
first = false;
}
out = out + options[iii];
out = out + keys[iii];
if (options[keys[iii]] != null) {
out = out + "=" + options[keys[iii]];
}
if(this.session.sessionData !== null) {
}
if (!isNullOrUndefined(this.session.sessionData)) {
if (addURLToken !== undefined && addURLToken === true) {
if(first === false) {
out = `${out }&`;
@ -199,7 +197,7 @@ export class HttpWrapperService {
// Deprecated ...
createRESTCall(api: string, inputOptions?: any) {
let basePage = environment.apiUrl;
let basePage = environment.server[environment.defaultServer];
let addressServerRest = `${basePage }/`;
let options = inputOptions;
if(options === undefined) {

View File

@ -0,0 +1,41 @@
import { ArianeService } from "./ariane";
import { BddService } from "./bdd";
import { CookiesService } from "./cookies";
import { DataService } from "./data";
import { HttpWrapperService, ModelResponseHttp, HTTPRequest, HTTPMimeType, HTTPRequestModel } from "./http-wrapper";
import { StorageService } from "./local-storage";
import { PopInService } from "./popin";
import { SeasonService } from "./season";
import { SeriesService } from "./series";
import { SessionService } from "./session";
import { SSOService } from "./sso";
import { TypeService } from "./type";
import { UniverseService } from "./universe";
import { UserService } from "./user";
import { VideoService } from "./video";
export {
CookiesService,
HttpWrapperService,
ModelResponseHttp,
HTTPRequest,
HTTPMimeType,
HTTPRequestModel,
StorageService,
PopInService,
SessionService,
UserService,
SSOService,
ArianeService,
BddService,
DataService,
SeasonService,
SeriesService,
TypeService,
UniverseService,
VideoService,
};

View File

@ -0,0 +1,54 @@
/** @file
* @author Edouard DUPIN
* @copyright 2018, Edouard DUPIN, all right reserved
* @license PROPRIETARY (see license file)
*/
import { Injectable } from '@angular/core';
import { environment } from '../../environments/environment';
@Injectable()
export class StorageService {
private baseLocalStorageName = environment.applName + '_';
constructor() {
}
set(cname: string, cvalue: string): void {
console.error(`storage set: ${cname} : ${cvalue}`);
localStorage.setItem(this.baseLocalStorageName + cname, cvalue);
}
// limit at the current session ...
setSession(cname: string, cvalue: string): void {
sessionStorage.setItem(this.baseLocalStorageName + cname, cvalue);
}
remove(cname: string) : void {
console.error(`storage remove: ${cname}`);
localStorage.removeItem(this.baseLocalStorageName + cname);
}
removeSession(cname: string) : void {
sessionStorage.removeItem(this.baseLocalStorageName + cname);
}
get(cname: string) : string | undefined {
console.error(`storage get: ${cname}`);
// TODO check expire day...
const data = localStorage.getItem(this.baseLocalStorageName + cname);
console.log(`get value form the storage (1): ${data}`)
if (data === null || data === undefined) {
return undefined;
}
return data;
}
getSession(cname: string) : string | undefined {
const data = sessionStorage.getItem(this.baseLocalStorageName + cname);
if (data === null || data === undefined) {
return undefined;
}
return data;
}
}

View File

@ -7,13 +7,12 @@
import { Injectable } from '@angular/core';
import { HttpWrapperService } from './http-wrapper';
import { DataInterface } from './dataInterface';
import { DataInterface } from '../utils';
import { BddService } from './bdd';
import { TypeCheck } from '../utils/dataInterface';
@Injectable()
export class SeasonService {
// 0: Not hide password; 1 hide password;
private identificationVersion: number = 1;
private serviceName:string = 'season';
constructor(private http: HttpWrapperService,
@ -50,7 +49,14 @@ export class SeasonService {
self.bdd.getVideo()
.then((response: DataInterface) => {
// let data = response.getsWhere([["==", "seasonId", id]], ["id", "name", "episode"], ["episode", "name"])
let data = response.getsWhere([ [ '==', 'seasonId', id ] ], undefined, [ 'episode', 'name' ]);
let data = response.getsWhere([
{
check: TypeCheck.EQUAL,
key: 'seasonId',
value: id,
},
],
[ 'episode', 'name' ]);
resolve(data);
}).catch((response) => {
reject(response);
@ -69,7 +75,12 @@ export class SeasonService {
self.bdd.getVideo()
.then((response: DataInterface) => {
// let data = response.getsWhere([["==", "seasonId", _id]], ["id", "name", "episode"], ["episode", "name"])
let data = response.getsWhere([ [ '==', 'seasonId', id ] ], undefined, [ 'episode', 'name' ]);
let data = response.getsWhere([
{
check: TypeCheck.EQUAL,
key: 'seasonId',
value: id,
} ] );
resolve(data.length);
}).catch((response) => {
reject(response);

View File

@ -7,14 +7,14 @@
import { Injectable } from '@angular/core';
import { HttpWrapperService } from './http-wrapper';
import { DataInterface } from './dataInterface';
import { DataInterface, TypeCheck } from '../utils/dataInterface';
import { BddService } from './bdd';
import { isNodeData, NodeData } from '../model';
import { isArrayOf, isNullOrUndefined } from '../utils';
@Injectable()
export class SeriesService {
// 0: Not hide password; 1 hide password;
private identificationVersion: number = 1;
private serviceName:string = 'series';
constructor(private http: HttpWrapperService,
@ -22,13 +22,13 @@ export class SeriesService {
console.log('Start SeriesService');
}
get(id:number):any {
get(id:number): Promise<NodeData> {
let self = this;
return new Promise((resolve, reject) => {
self.bdd.getSeries()
.then((response:DataInterface) => {
let data = response.get(id);
if(data === null || data === undefined) {
if(isNullOrUndefined(data)) {
reject('Data does not exist in the local BDD');
return;
}
@ -40,7 +40,7 @@ export class SeriesService {
});
}
getData():any {
getData(): Promise<NodeData[]> {
let self = this;
return new Promise((resolve, reject) => {
self.bdd.getSeries()
@ -54,13 +54,23 @@ export class SeriesService {
});
}
getOrder():any {
getOrder(): Promise<NodeData[]> {
let self = this;
return new Promise((resolve, reject) => {
self.bdd.getSeries()
.then((response:DataInterface) => {
let data = response.getsWhere([ [ '!=', 'id', null ] ], [ 'id', 'name' ], [ 'name', 'id' ]);
.then((response: DataInterface) => {
let data = response.getsWhere([
{
check: TypeCheck.NOT_EQUAL,
key: 'id',
value: [undefined, null],
},
],
[ 'name', 'id' ]);
if (isArrayOf(data, isNodeData)) {
resolve(data);
}
reject("The model is wrong ...");
}).catch((response) => {
console.log(`[E] ${ self.constructor.name }: can not retrive BDD values`);
reject(response);
@ -68,28 +78,41 @@ export class SeriesService {
});
}
getVideoAll(id:number):any {
// this.checkLocalBdd();
}
getVideo(id:number):any {
getVideo(id:number):Promise<NodeData[]> {
let self = this;
return new Promise((resolve, reject) => {
self.bdd.getVideo()
.then((response:DataInterface) => {
let data = response.getsWhere([ [ '==', 'seriesId', id ], [ '==', 'seasonId', null ] ], undefined, [ 'episode', 'name' ]);
let data = response.getsWhere([
{
check: TypeCheck.EQUAL,
key: 'seriesId',
value: id,
}, {
check: TypeCheck.EQUAL,
key: 'seasonId',
value: undefined,
},
],
[ 'episode', 'name' ]);
resolve(data);
}).catch((response) => {
reject(response);
});
});
}
countVideo(id:number):any {
countVideo(id:number): Promise<number> {
let self = this;
return new Promise((resolve, reject) => {
self.bdd.getVideo()
.then((response:DataInterface) => {
let data = response.getsWhere([ [ '==', 'seriesId', id ] ], undefined, undefined);
let data = response.getsWhere([
{
check: TypeCheck.EQUAL,
key: 'seriesId',
value: id,
},
]);
resolve(data.length);
}).catch((response) => {
reject(response);
@ -100,27 +123,22 @@ export class SeriesService {
/**
* Get all the season of a specific series
* @param id - ID of the series
* @param select - Selection filter
* @returns the required List.
*/
getSeason(id:number, select:string[] = []):any {
getSeason(id:number): Promise<NodeData[]> {
let self = this;
return new Promise((resolve, reject) => {
self.bdd.getSeason()
.then((response:DataInterface) => {
let data = response.getsWhere([ [ '==', 'parentId', id ] ], [ 'id' ], [ 'number' ]);
if(select.length === 0) {
let data = response.getsWhere([
{
check: TypeCheck.EQUAL,
key: 'parentId',
value: id,
},
], [ 'id' ]);
resolve(data);
return;
}
if(select[0] === '*') {
let data2 = response.getsWhere([ [ '==', 'id', data ] ], undefined, [ 'number' ]);
resolve(data2);
return;
}
let data3 = response.getsWhere([ [ '==', 'id', data ] ], select, [ 'number' ]);
resolve(data3);
return;
}).catch((response) => {
reject(response);
});

View File

@ -14,12 +14,13 @@ export enum UserRoles222 {
@Injectable()
export class SessionService {
private tokenJwt = null;
public sessionData = null;
public userLogin = null;
public userAdmin = null;
public userEMail = null;
public userAvatar = null;
// public tocken = null;
public userId = null;
@Output() change: EventEmitter<boolean> = new EventEmitter();
@ -31,18 +32,22 @@ export class SessionService {
* @brief Create a new session.
*
* @param sessionData -
* @param userId -
* @param userLogin -
* @param userEMail -
* @param userAdmin -
* @param userAvatar -
*/
create(sessionData,
userId: string,
userLogin: string,
userEMail: string,
userAdmin: boolean,
userAvatar: string) {
console.log('Session Create');
console.log(`Session Create: userId=${userId} userLogin=${userLogin} userEMail=${userEMail} userAdmin=${userAdmin} userAvatar=${userAvatar} `);
this.tokenJwt = undefined;
this.sessionData = sessionData;
this.userId = userId;
this.userLogin = userLogin;
this.userAdmin = userAdmin;
this.userEMail = userEMail;
@ -55,16 +60,22 @@ export class SessionService {
*/
destroy() {
console.log('Session REMOVE');
// Cookies.remove("yota-login");
// Cookies.remove("yota-password");
let last = this.sessionData;
this.sessionData = null;
this.tokenJwt = undefined;
this.userId = null;
this.userLogin = null;
this.userAdmin = null;
this.userEMail = null;
this.userAvatar = null;
this.change.emit(false);
}
setToken(jwt: string) {
this.tokenJwt = jwt;
}
getToken(): string | undefined {
return this.tokenJwt;
}
islogged() {
return this.sessionData !== null;
}
@ -90,9 +101,9 @@ export class SessionService {
return this.userLogin;
}
getAvatar() {
if(this.userAvatar === '') {
if(this.userAvatar === false) {
return 'assets/images/avatar_generic.svg';
}
return this.userAvatar;
return this.userId;
}
}

View File

@ -0,0 +1,60 @@
/** @file
* @author Edouard DUPIN
* @copyright 2018, Edouard DUPIN, all right reserved
* @license PROPRIETARY (see license file)
*/
import { Injectable } from '@angular/core';
import { environment } from '../../environments/environment';
@Injectable()
export class SSOService {
constructor() {
console.log('Start SSOService');
}
utf8_to_b64( str:string ): string {
return window.btoa(unescape(encodeURIComponent( str ))).replace("=", "");
}
b64_to_utf8( str:string ): string {
return decodeURIComponent(escape(window.atob( str )));
}
/**
* Request SSO connection
*/
hashLocalData(data?: string): string {
if (data != undefined) {
return this.utf8_to_b64(data);
}
return this.utf8_to_b64('home');
}
/**
* Request SSO connection
*/
unHashLocalData(data: string): string {
return this.b64_to_utf8(data);
}
/**
* Request SSO connection
*/
requestSignIn(name?: string): void {
window.location.href = environment.ssoSignIn + this.hashLocalData(name);
}
/**
* Request SSO Disconnect
*/
requestSignOut(name?: string): void {
if (name === undefined) {
name = 'home';
}
window.location.href = environment.ssoSignOut + this.hashLocalData(name);
}
/**
* Request SSO signUp
*/
requestSignUp(name?: string): void {
window.location.href = environment.ssoSignUp + this.hashLocalData(name);
}
}

View File

@ -8,8 +8,9 @@ import { Injectable } from '@angular/core';
import { HttpWrapperService } from './http-wrapper';
import { BddService } from './bdd';
import { DataInterface } from './dataInterface';
import { DataInterface, isNullOrUndefined } from '../utils';
import { NodeData } from '../model';
import { TypeCheck } from '../utils/dataInterface';
export interface MessageLogIn {
id: number;
@ -17,14 +18,8 @@ export interface MessageLogIn {
description: string;
}
declare function SHA512(param1: any): any;
declare function dateFormat(param1: any, param2: any): any;
@Injectable()
export class TypeService {
// 0: Not hide password; 1 hide password;
private identificationVersion: number = 1;
private serviceName:string = 'type';
constructor(private http: HttpWrapperService,
private bdd: BddService) {
@ -32,7 +27,7 @@ export class TypeService {
}
getData():any {
getData(): Promise<NodeData[]> {
let self = this;
return new Promise((resolve, reject) => {
self.bdd.getType()
@ -46,13 +41,13 @@ export class TypeService {
});
}
get(_id:number):any {
get(_id:number): Promise<NodeData> {
let self = this;
return new Promise((resolve, reject) => {
self.bdd.getType()
.then((response: DataInterface) => {
let data = response.get(_id);
if(data === null || data === undefined) {
if(isNullOrUndefined(data)) {
reject('Data does not exist in the local BDD');
return;
}
@ -63,12 +58,17 @@ export class TypeService {
});
}
countVideo(_id:number):any {
countVideo(id:number): Promise<number> {
let self = this;
return new Promise((resolve, reject) => {
self.bdd.getVideo()
.then((response: DataInterface) => {
let data = response.getsWhere([ [ '==', 'typeId', _id ] ], undefined, undefined);
let data = response.getsWhere([
{
check: TypeCheck.EQUAL,
key: 'typeId',
value: id,
} ] );
resolve(data.length);
}).catch((response) => {
reject(response);
@ -76,64 +76,26 @@ export class TypeService {
});
}
getSubVideo(_id:number, _select:Array<string> = []):any {
getSubVideo(id:number): Promise<NodeData[]> {
let self = this;
return new Promise((resolve, reject) => {
self.bdd.getVideo()
.then((response: DataInterface) => {
if(_select.length === 0) {
let data = response.getsWhere([ [ '==', 'typeId', _id ], [ '==', 'seriesId', null ], [ '==', 'universeId', null ] ], undefined, [ 'name' ]);
resolve(data);
return;
}
if(_select[0] === '*') {
let data = response.getsWhere([ [ '==', 'typeId', _id ], [ '==', 'seriesId', null ], [ '==', 'universeId', null ] ], undefined, [ 'name' ]);
resolve(data);
return;
}
let data = response.getsWhere([ [ '==', 'typeId', _id ], [ '==', 'seriesId', null ], [ '==', 'universeId', null ] ], _select, [ 'name' ]);
resolve(data);
return;
}).catch((response) => {
reject(response);
});
});
}
getSubSeries(id:number, select:string[] = []):any {
let self = this;
/*
return new Promise((resolve, reject) => {
self.bdd.getVideo()
.then(function(response: DataInterface) {
let data = response.getsWhere([["==", "typeId", _id], ["!=", "seriesId", null], ["==", "universeId", null]], ["seriesId"], ["name"]);
if (_select.length == 0) {
resolve(data);
return;
}
self.bdd.getSeries()
.then(function(response2: DataInterface) {
if (_select[0] == "*") {
let data2 = response2.getsWhere([["==", "id", data]], undefined, ["name"]);
resolve(data2);
return;
}
let data3 = response2.getsWhere([["==", "id", data]], _select, ["name"]);
resolve(data3);
return;
}).catch(function(response2) {
reject(response2);
});
}).catch(function(response) {
reject(response);
});
});
*/
return new Promise((resolve, reject) => {
self.bdd.getSeries()
.then((response: DataInterface) => {
let data = response.getsWhere([ [ '==', 'parentId', id ] ], undefined, [ 'name' ]);
let data = response.getsWhere([
{
check: TypeCheck.EQUAL,
key: 'typeId',
value: id,
}, {
check: TypeCheck.EQUAL,
key: 'seriesId',
value: undefined,
}, {
check: TypeCheck.EQUAL,
key: 'universeId',
value: undefined,
},
], [ 'name' ] );
resolve(data);
}).catch((response) => {
reject(response);
@ -141,42 +103,61 @@ export class TypeService {
});
}
getSubUniverse(id:number, select:string[] = []):any {
getSubSeries(id:number): Promise<NodeData[]> {
let self = this;
return new Promise((resolve, reject) => {
self.bdd.getSeries()
.then((response: DataInterface) => {
let data = response.getsWhere([
{
check: TypeCheck.EQUAL,
key: 'parentId',
value: id,
} ],
[ 'name' ]);
resolve(data);
}).catch((response) => {
reject(response);
});
});
}
getSubUniverse(id:number): Promise<NodeData[]> {
let self = this;
return new Promise((resolve, reject) => {
self.bdd.getVideo()
.then((response: DataInterface) => {
let data = response.getsWhere([ [ '==', 'typeId', id ], [ '==', 'seriesId', null ], [ '==', 'universeId', null ] ], [ 'universId' ], [ 'name' ]);
if(select.length === 0) {
let data = response.getsWhere([
{
check: TypeCheck.EQUAL,
key: 'typeId',
value: id,
}, {
check: TypeCheck.EQUAL,
key: 'seriesId',
value: [undefined, null],
}, {
check: TypeCheck.NOT_EQUAL,
key: 'universeId',
value: undefined,
},
]);
//, [ 'universId' ]);
resolve(data);
return;
}
self.bdd.getUniverse()
.then((response2: DataInterface) => {
if(select[0] === '*') {
let data2 = response2.getsWhere([ [ '==', 'id', data ] ], undefined, [ 'name' ]);
resolve(data2);
return;
}
let data3 = response2.getsWhere([ [ '==', 'id', data ] ], select, [ 'name' ]);
resolve(data3);
return;
}).catch((response2) => {
reject(response2);
});
}).catch((response: any) => {
reject(response);
});
});
}
getCoverUrl(coverId:number):any {
getCoverUrl(coverId:number): string {
return this.http.createRESTCall2({
api: `data/${coverId}`,
addURLToken: true,
});
}
getCoverThumbnailUrl(coverId:number):any {
getCoverThumbnailUrl(coverId:number): string {
return this.http.createRESTCall2({
api: `data/thumbnail/${coverId}`,
addURLToken: true,

View File

@ -5,8 +5,12 @@
*/
import { Injectable } from '@angular/core';
import { environment } from '../../environments/environment';
import { HTTPMimeType, HTTPRequestModel, HttpWrapperService, ModelResponseHttp } from './http-wrapper';
import { StorageService } from './local-storage';
import { SessionService } from './session';
import { SSOService } from './sso';
interface MessageLogIn {
login: string;
@ -24,87 +28,105 @@ interface MessageAnswer_USER_CONNECT {
}
declare function SHA512(param1: any): any;
declare function dateFormat(param1: any, param2: any): any;
@Injectable()
export class UserService {
// 0: Not hide password; 1 hide password;
private identificationVersion: number = 1;
private cookiesRememberMe = 'karauth-remember-me';
private cookiesToken = 'karauth-token';
constructor(private http: HttpWrapperService) {
constructor(
private storageService: StorageService,
private http: HttpWrapperService,
private sessionService: SessionService,
private ssoService: SSOService) {
console.log('Start UserService');
}
login(_login: string, _password: string):any {
return this.loginSha(_login, SHA512(_password));
/**
* Disconnect the user from the current session ==> this remove the curreent Token
*/
logOut(): void {
this.removeSession();
this.ssoService.requestSignOut("home");
}
loginSha(login: string, password: string):any {
removeSession(): void {
this.storageService.remove(this.cookiesRememberMe);
this.storageService.removeSession(this.cookiesToken);
this.sessionService.destroy();
}
private isTokenUpToDate(token: string): boolean {
if (token === null || token === undefined || token.length < 25) {
return false;
}
// Separate the Data:
const elems = token.split('.');
if (elems.length !== 3 ) {
return false;
}
const tokenHeader = decodeURIComponent(escape(window.atob( elems[0] )));
const tokenData = decodeURIComponent(escape(window.atob( elems[1] )));
console.error(`Retreive local token: \nheader=${tokenHeader} \ndata=${tokenData}`);
const parsedData = JSON.parse(tokenData);
console.error(`Retreive exp data=${new Date(parsedData.exp*1000).toISOString()} < ${new Date().toISOString()}`);
const expireIn = new Date(parsedData.exp*1000);
const nowTime = new Date();
return expireIn > nowTime;
}
/**
* Check if the system can be connected
*/
checkAutoConnect(): Promise<void> {
let self = this;
return new Promise<void>((resolve, reject) => {
// Need to use the windows global route to prevent the log in cycle ...
// And in the mlain application position, the route does not have curently root the page
if (window.location.pathname.startsWith("/sso/")) {
reject();
return;
}
let rememberMe = self.storageService.get(self.cookiesRememberMe)==="true";
// TODO: in case of jest reload ==> no need to manage the SSO ==> just keep the token ... it in enought...
let token = self.storageService.getSession(self.cookiesToken);
// TODO: check validity of th eToken:
if (self.isTokenUpToDate(token)) {
self.startSession(token, rememberMe).finally(() => {
resolve();
})
} else {
console.log(`Get previous connection ... `);
if(rememberMe) {
// just to the sso !!!
self.ssoService.requestSignIn();
reject();
}
}
});
}
startSession(token : string, rememberMe: boolean): Promise<string> {
let self = this;
return new Promise((resolve, reject) => {
self.getTocken(login, password).then(
(value: any) => {
console.log('Get token ...');
self.loginWithToken(value.userId, value.token).then(
(value2: any) => {
self.retreiveMe(token).then(
(value2: boolean) => {
if(rememberMe === true) {
self.storageService.set(self.cookiesRememberMe, rememberMe?"true":"false");
}
// transfer the session token property
value2.session = {
userId: value.userId,
token: value.token,
endValidityTime: value.endValidityTime
};
resolve(value2);
}, (value2) => {
self.sessionService.setToken(token);
self.storageService.setSession(self.cookiesToken, token);
resolve(self.sessionService.getLogin());
}).catch(() => {
reject('sdfsdfsdf');
});
}, (value) => {
console.log('User NOT created');
reject('rrfrrrrr');
});
});
}
getTocken(login : string, password : string) : Promise<any> {
console.log(`AuthService.getToken ... '${ login }':'${ password }'`);
let currentDate:number = dateFormat(new Date(), 'm-d-Y h:i:s ms');
let data:MessageLogIn;
// create request:
if(this.identificationVersion === 1) {
data = {
login: login,
method: 'v1',
time: currentDate,
// we mix the password to be sure that it can not be used an other time ...
password: SHA512(`login='${ login }';pass='${ password }';date='${ currentDate }'`)
};
} else {
console.log('AuthService.login ... Wrong method ...');
}
console.log(`call users/connect data=${ JSON.stringify(data, null, 2)}`);
return new Promise((resolve, reject) => {
this.http.requestJson({
server: 'karauth',
endPoint: 'users/get_token',
requestType: HTTPRequestModel.POST,
accept: HTTPMimeType.JSON,
contentType: HTTPMimeType.JSON,
body: data,
disableTocken: true,
}).then((response: ModelResponseHttp) =>{
console.log(`Data token: id=${ response.data.id}`);
console.log(`Data token: userId=${ response.data.userId}`);
console.log(`Data token: token=${ response.data.token}`);
console.log(`Data token: createTime=${ response.data.createTime}`);
console.log(`Data token: endValidityTime=${ response.data.endValidityTime}`);
resolve(response.data);
}).catch((error:any) => {
reject(`return ERROR ${ JSON.stringify(error, null, 2)}`);
});
});
}
loginWithToken(userId : string, token : string) {
console.log(`AuthService.loginWithToken ... '${ userId }':'${ token }'`);
retreiveMe(token : string): Promise<boolean> {
console.log(`AuthService.loginWithToken ... '${ token }'`);
let self = this;
return new Promise((resolve, reject) => {
this.http.requestJson({
//server: 'karauth',
@ -112,53 +134,22 @@ export class UserService {
requestType: HTTPRequestModel.GET,
accept: HTTPMimeType.JSON,
contentType: HTTPMimeType.JSON,
authorization: `Yota ${userId}:${token}`, // special case, the token is set after this request...
authorization: `Yota ${token}`, // special case, the token is set after this request...
}).then((response: ModelResponseHttp) =>{
// TODO: check type ...
console.log(`loginWithToken : get some data to check: ${JSON.stringify(response.data)}`)
resolve(response.data);
self.sessionService.create(
response.data.sessionId,
response.data.id,
response.data.login,
response.data.email,
response.data.role,
response.data.avatar);
resolve(true);
}).catch((error:any) => {
reject(`return ERROR ${ JSON.stringify(error, null, 2)}`);
});
});
/*
console.log("AuthService.login ... '" + _login + "':'" + _password + "'");
let currentDate:number = dateFormat(new Date(), 'm-d-Y h:i:s ms');
let data:MessageLogIn;
// create request:
if (this.identificationVersion == 1) {
data = {
login: _login,
method: "v1",
time: currentDate,
// we mix the password to be sure that it can not be used an other time ...
password: SHA512("login='" + _login + "';pass='" + _password + "';date='" + currentDate + "'")
};
} else {
console.log("AuthService.login ... Wrong method ...");
}
const httpOption = { 'Content-Type': 'application/json' };
console.log("call users/connect data=" + JSON.stringify(data, null, 2));
return new Promise((resolve, reject) => {
this.httpOAuth.post("users/connect", httpOption, data)
.then(function(response: any) {
if (response.status == 200) {
resolve(response.data);
return;
}
reject("An error occured");
}, function(response: any) {
if (typeof response.data === 'undefined') {
reject("return ERROR undefined");
} else {
reject("return ERROR " + JSON.stringify(response.data, null, 2));
}
});
});
*/
}
create(login : string, email : string, password : string) {
@ -210,50 +201,5 @@ export class UserService {
*/
return false;
}
checkLogin(login: string) {
let params = {
login: login
};
return new Promise((resolve, reject) => {
this.http.requestJson({
server: 'karauth',
endPoint: 'users/check_login',
requestType: HTTPRequestModel.GET,
accept: HTTPMimeType.JSON,
contentType: HTTPMimeType.JSON,
params,
}).then((response: ModelResponseHttp) =>{
// TODO: check type ...
console.log(`createSha : get some data to check: ${JSON.stringify(response.data)}`)
resolve(response.data);
}).catch((error:any) => {
reject(`return ERROR ${ JSON.stringify(error, null, 2)}`);
});
});
}
checkEMail(email: string) {
let params = {
email: email
};
return new Promise((resolve, reject) => {
this.http.requestJson({
server: 'karauth',
endPoint: 'users/check_email',
requestType: HTTPRequestModel.GET,
accept: HTTPMimeType.JSON,
contentType: HTTPMimeType.JSON,
params,
}).then((response: ModelResponseHttp) =>{
// TODO: check type ...
console.log(`createSha : get some data to check: ${JSON.stringify(response.data)}`)
resolve(response.data);
}).catch((error:any) => {
reject(`return ERROR ${ JSON.stringify(error, null, 2)}`);
});
});
}
}

View File

@ -8,7 +8,7 @@ import { Injectable } from '@angular/core';
import { HttpWrapperService } from './http-wrapper';
import { BddService } from './bdd';
import { DataInterface } from './dataInterface';
import { DataInterface } from '../utils/dataInterface';
@Injectable()
export class VideoService {

View File

@ -4,21 +4,26 @@
* @license PROPRIETARY (see license file)
*/
export interface MediaSmall {
id: number;
name: string;
description?: string;
dataId?: number;
typeId?: number;
universeId?: number;
seriesId?: number;
seasonId?: number;
episode?: number;
date?: number;
time?: number;
ageLimit?: string;
covers: number[];
};
import { NodeData } from "../model";
import { isArray, isNullOrUndefined, isUndefined } from "./validator";
export enum TypeCheck {
EQUAL = '==',
NOT_EQUAL = '!=',
LESS = '<',
LESS_EQUAL = '<=',
GREATER = '>',
GREATER_EQUAL = '>=',
}
export interface SelectModel {
check: TypeCheck;
key: string;
value?: number|string|boolean|number[]|string[];
}
/*
{ check: TypeCheck.EQUAL, key: sss, value: null}
*/
/**
* @breif Generic interface to access to the BDD (no BDD, direct file IO)
@ -26,7 +31,7 @@
export class DataInterface {
constructor(
private name: string,
private bdd: MediaSmall[] ) {
private bdd: NodeData[] ) {
}
public getTableIndex(id: number) {
@ -38,22 +43,19 @@ export class DataInterface {
return undefined;
}
public gets(filter?: any) {
public gets(): NodeData[] {
console.log(`[I] gets ${ this.name}`);
if(filter === undefined) {
return this.bdd;
}
return this.filterObjectValues(this.bdd, filter);
}
public getsWhere(select, filter?: string[], orderBy?: string[]) {
public getsWhere(select: SelectModel[], orderBy?: string[]): NodeData[] {
// console.log("[I] gets_where " + this.name + " select " + _select);
let tmpList = this.getSubList(this.bdd, select);
tmpList = this.orderBy(tmpList, orderBy);
return this.filterObjectValues(tmpList, filter);
return tmpList;
}
public get(id: number) {
public get(id: number): NodeData {
// console.log("[I] get " + this.name + " " + _id);
for(let iii = 0; iii < this.bdd.length; iii++) {
if(this.bdd[iii].id === id) {
@ -64,7 +66,7 @@ export class DataInterface {
return undefined;
}
public getNameLikeAll(name: string) {
public getNameLikeAll(name: string): NodeData[] {
let out = undefined;
let nameLower = name.toLowerCase();
for(let iii = 0; iii < this.bdd.length; iii++) {
@ -77,7 +79,7 @@ export class DataInterface {
}
return out;
}
public getNameLike(name: string): any[] {
public getNameLike(name: string): NodeData[] {
let out = [];
let nameLower = name.toLowerCase();
for(let iii = 0; iii < this.bdd.length; iii++) {
@ -89,7 +91,7 @@ export class DataInterface {
return out;
}
public set(id: number, value: any): void {
public set(id: number, value: NodeData): void {
console.log(`[I] Set ${ this.name } ${ id}`);
for(let iii = 0; iii < this.bdd.length; iii++) {
console.log(` check: ${ this.bdd[iii].id}`);
@ -109,7 +111,7 @@ export class DataInterface {
}
}
public find(listToken, values) {
public find(listToken, values): NodeData[] {
let out = [];
for(let iii = 0; iii < this.bdd.length; iii++) {
let find = true;
@ -126,15 +128,15 @@ export class DataInterface {
return out;
}
public count(select = undefined) {
if(select === undefined) {
public count(select?: SelectModel[]) {
if(isNullOrUndefined(select)) {
return this.bdd.length;
}
let tmp = this.getSubList(this.bdd, select);
return tmp.length;
}
public existIn(value: any, listValues: any) {
public existIn(value, listValues: number[]|string[]): boolean {
for(let iii = 0; iii < listValues.length; iii++) {
if(value === listValues[iii]) {
return true;
@ -143,8 +145,8 @@ export class DataInterface {
return false;
}
public getSubList(values: MediaSmall[], select: any[][] ) {
let out = [];
public getSubList(values: NodeData[], select?: SelectModel[] ): NodeData[] {
let out = [] as NodeData[];
for(let iiiElem = 0; iiiElem < values.length; iiiElem++) {
let find = true;
if(select.length === 0) {
@ -152,22 +154,16 @@ export class DataInterface {
}
// console.log("Check : " + JSON.stringify(_values[iii_elem], null, 2));
for(let iiiSelect = 0; iiiSelect < select.length; iiiSelect++) {
if(select[iiiSelect].length !== 3) {
console.log('[E] Internal Server Error: wrong select definition ...');
return undefined;
}
let typeCheck = select[iiiSelect][0];
let token = select[iiiSelect][1];
let value = select[iiiSelect][2];
if(Array.isArray(value)) {
if(values[iiiElem][token] !== undefined) {
if(typeCheck === '==') {
if(this.existIn(values[iiiElem][token], value) === false) {
let control = select[iiiSelect];
let valueElement = values[iiiElem][control.key]
if(isArray(control.value)) {
if(control.check === TypeCheck.EQUAL) {
if(this.existIn(valueElement, control.value) === false) {
find = false;
break;
}
} else if(typeCheck === '!=') {
if(this.existIn(values[iiiElem][token], value) === false) {
} else if(control.check === TypeCheck.NOT_EQUAL) {
if(this.existIn(valueElement, control.value) === false) {
find = false;
break;
}
@ -176,40 +172,34 @@ export class DataInterface {
return undefined;
}
} else {
//console.log(" [" + control.key + "] = " + valueElement);
if(control.check === TypeCheck.EQUAL) {
if(valueElement !== control.value) {
find = false;
break;
}
} else {
// console.log(" [" + token + "] = " + values[iii_elem][token]);
if(values[iiiElem][token] !== undefined) {
// console.log(" '" + type_check + "' " + value);
if(typeCheck === '==') {
if(values[iiiElem][token] !== value) {
} else if(control.check === TypeCheck.NOT_EQUAL) {
if(valueElement === control.value) {
find = false;
break;
}
} else if(typeCheck === '!=') {
if(values[iiiElem][token] === value) {
} else if(control.check === TypeCheck.LESS) {
if(valueElement >= control.value) {
find = false;
break;
}
} else if(typeCheck === '<') {
if(values[iiiElem][token] >= value) {
} else if(control.check === TypeCheck.LESS_EQUAL) {
if(valueElement > control.value) {
find = false;
break;
}
} else if(typeCheck === '<=') {
if(values[iiiElem][token] > value) {
} else if(control.check === TypeCheck.GREATER) {
if(valueElement <= control.value) {
find = false;
break;
}
} else if(typeCheck === '>') {
if(values[iiiElem][token] <= value) {
find = false;
break;
}
} else if(typeCheck === '>=') {
if(values[iiiElem][token] < value) {
} else if(control.check === TypeCheck.GREATER_EQUAL) {
if(valueElement < control.value) {
find = false;
break;
}
@ -217,10 +207,6 @@ export class DataInterface {
console.log('[ERROR] Internal Server Error{ unknow comparing type ...');
return undefined;
}
} else {
find = false;
break;
}
}
}
if(find === true) {
@ -233,8 +219,8 @@ export class DataInterface {
return out;
}
public orderBy(values: any[], order: string[]): any[] {
if(order === undefined) {
public orderBy(values: NodeData[], order: string[]): NodeData[] {
if(isNullOrUndefined(order)) {
return values;
}
if(order.length === 0) {
@ -287,35 +273,5 @@ export class DataInterface {
}
return out;
}
public filterObjectValues(values: MediaSmall[], filter: string[]): any[] {
let out: MediaSmall[] = [];
if(filter === undefined) {
return values;
}
if(filter.length === 1) {
let token = filter[0];
for(let iii = 0; iii < values.length; iii++) {
if(values[iii][token] === undefined) {
continue;
}
if(this.existIn(values[iii][token], out) === false) {
out.push(values[iii][token]);
}
}
return out;
}
for(let iii = 0; iii < values.length; iii++) {
let elementOut: any = {};
for(let jjj = 0; jjj < filter.length; jjj++) {
if(values[iii][filter[jjj]] === undefined) {
continue;
}
elementOut[filter[jjj]] = values[iii][filter[jjj]];
}
out.push(elementOut);
}
return out;
}
}

View File

@ -0,0 +1,21 @@
import { DataInterface } from "./dataInterface";
import { isArray, isArrayOf, isBoolean, isNull, isNullOrUndefined, isNumber, isNumberFinite, isObject, isOptionalOf, isOptionalArrayOf, isString, isUndefined } from "./validator";
export {
isNumber,
isNumberFinite,
isBoolean,
isString,
isArray,
isNull,
isUndefined,
isNullOrUndefined,
isObject,
isArrayOf,
isOptionalOf,
isOptionalArrayOf,
DataInterface,
}

View File

@ -0,0 +1,52 @@
export function isNumber(data: any): data is number {
return typeof data === "number";
}
export function isNumberFinite(data: any): data is number {
return isNumber(data) && isFinite(data);
}
export function isBoolean(data: any): data is boolean {
return typeof data === "boolean";
}
export function isString(data: any): data is string {
return typeof data === "string";
}
export function isArray(data: any): data is any[] {
return Array.isArray(data);
}
export function isNull(data: any): data is null {
return data === null;
}
export function isUndefined(data: any): data is undefined {
return data === undefined;
}
export function isNullOrUndefined(data: any): data is undefined | null {
return data === undefined || data === null;
}
export function isObject(data: any): data is any {
return !isNullOrUndefined(data)
&& typeof data === 'object'
&& !isArray(data);
}
export function isArrayOf<TYPE>(data: any, typeChecker: (subData: any) => subData is TYPE, length?: number): data is TYPE[] {
if (!isArray(data)) {
return false;
}
if (!data.every(typeChecker)) {
return false;
}
if (!isUndefined(length) && data.length != length) {
return false;
}
return true;
}
export function isOptionalOf<TYPE>(data: any, typeChecker: (subData: any) => subData is TYPE): data is TYPE | undefined {
return isUndefined(data) || typeChecker(data);
}
export function isOptionalArrayOf<TYPE>(data: any, typeChecker: (subData: any) => subData is TYPE): data is TYPE[] | undefined {
return isUndefined(data) || isArrayOf(data, typeChecker);
}

View File

@ -1,24 +0,0 @@
/**
* @brief create the rest call element of the link
*/
let createRESTCall = function(api, options) {
// http://localhost/exercice
let basePage = "" + window.location;
if (basePage.endsWith("index.xhtml") == true) {
basePage = basePage.substring(0, basePage.length - 11);
}
if (basePage.endsWith("index.php") == true) {
basePage = basePage.substring(0, basePage.length - 10);
}
let addressServerRest =basePage + "/api/v1/index.php";
if (typeof options === 'undefined') {
options = [];
}
let out = addressServerRest + "?REST=" + api;
for (let iii=0; iii<options.length; iii++) {
out += "&" + options[iii];
}
return out;
}

View File

@ -1,26 +1,66 @@
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<svg
xmlns:dc="http://purl.org/dc/elements/1.1/"
xmlns:cc="http://creativecommons.org/ns#"
xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
xmlns:svg="http://www.w3.org/2000/svg"
xmlns="http://www.w3.org/2000/svg"
width="499"
height="498"
viewBox="0 0 499 498">
viewBox="0 0 499 498"
version="1.1"
id="svg10"
sodipodi:docname="avatar_generic.svg"
inkscape:version="1.1.2 (0a00cf5339, 2022-02-04, custom)"
xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
xmlns="http://www.w3.org/2000/svg"
xmlns:svg="http://www.w3.org/2000/svg">
<defs
id="defs14" />
<sodipodi:namedview
id="namedview12"
pagecolor="#ffffff"
bordercolor="#666666"
borderopacity="1.0"
inkscape:pageshadow="2"
inkscape:pageopacity="0.0"
inkscape:pagecheckerboard="0"
showgrid="false"
inkscape:zoom="3.5060241"
inkscape:cx="344.97766"
inkscape:cy="288.78866"
inkscape:window-width="3838"
inkscape:window-height="2118"
inkscape:window-x="0"
inkscape:window-y="20"
inkscape:window-maximized="1"
inkscape:current-layer="svg10" />
<rect
style="fill:#4c83e5;fill-opacity:1;stroke:none;stroke-width:8.82841587;stroke-opacity:1"
width="500"
height="500"
x="0"
y="-1.9999847" />
y="-1.9999847"
id="rect2" />
<path
style="fill:#ffffff;fill-opacity:1;stroke:none;stroke-opacity:1"
d="m 204.04675,299.92172 64.38231,-8.25011 84.38034,95.33059 -50.65607,144.5704 -137.27461,10.07178 -8.02011,-145.66775 z"/>
style="fill:#4e4e4d;stroke:#000000;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1;fill-opacity:1"
d="m 198.78572,292.40268 -11.97951,28.10434 -7.03868,-39.62542 -32.77188,20.51375 14.30166,-59.1095 -47.70972,20.8692 30.95257,-58.44261 -40.08325,-11.9709 50.99682,-31.08004 -30.32488,-33.92052 41.38608,6.88643 c 0,0 -27.42157,-58.130582 -26.08007,-58.130582 1.34149,0 54.85161,37.962212 54.85161,37.962212 l 6.10019,-52.959427 22.55992,46.026947 33.20732,-51.718401 8.75817,54.113371 53.78031,-55.134502 -14.88381,76.635492 112.00146,-17.67965 -84.26404,54.10353 65.61018,10.26713 -53.91421,37.51917 40.05564,55.00796 -51.48529,-23.57551 7.49544,56.99322 -27.79947,-24.64556 -3.80452,36.62241 -23.37869,-22.14564 -5.89389,23.82189 -20.64297,-29.48769 -15.46209,46.92367 -7.2608,-54.46889 -21.32424,51.07849 z"
id="path3162"
sodipodi:nodetypes="cccccccccccsccccccccccccccccccccccc" />
<path
d="m 151.70726,153.48377 98.32028,-57.471057 56.94703,21.629237 42.18786,87.1369 -8.8547,99.27952 c 0,0 -50.49799,16.08876 -49.46915,20.02305 1.64608,6.29463 -6.63579,19.542 -19.42333,31.06884 -11.04013,9.95169 -21.88069,22.4832 -25.78302,29.80472 -1.77209,3.32477 -3.61064,6.04503 -4.08568,6.04503 -0.47504,0 -2.26404,-4.6125 -3.97555,-10.25 -7.0054,-23.07485 -5.43752,-20.34841 -16.04346,-27.89857 -14.90382,-10.60973 -22.13256,-19.44659 -23.88228,-29.19518 l -0.74599,-4.15625 -49.90362,-18.10466 z"
style="fill:#fbd0a6"/>
style="fill:#fbd0a6;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 126.90172,351.92657 55.90379,145.23242 168.77912,0.48055 8.10502,-147.83696 -56.19339,-10.73582 -9.91368,3.09728 -8.25753,-48.27446 -8.77147,-41.82541 -73.97306,-0.86753 -4.65072,84.85557 z"
id="path3467"
sodipodi:nodetypes="ccccccccccc" />
<path
d="m 55.528901,495.75001 c 0.527163,-1.2375 3.024666,-9.9 5.550006,-19.25 8.980498,-33.25004 20.717058,-73.14872 24.415208,-83 7.96468,-21.21664 17.411415,-36.82083 25.634775,-42.3437 3.46578,-2.32765 7.75343,-3.40938 27.99561,-7.063 24.83316,-4.48226 37.7984,-7.72387 44.43556,-11.10989 2.13829,-1.09087 4.2852,-1.98341 4.77091,-1.98341 0.48571,0 0.25824,3.0375 -0.50549,6.75 -1.50052,7.29402 -2.99983,49.3173 -1.91392,53.64393 0.99077,3.94752 2.8969,3.16745 7.07154,-2.89393 3.53084,-5.12662 5.54444,-6.78317 5.54444,-4.56129 0,2.60045 5.3114,31.27728 8.05039,43.46495 5.98108,26.61396 16.76339,62.48393 20.54452,68.34634 l 1.4512,2.25 H 141.57203 54.570422 Z m 210.460079,-0.0508 c 2.17179,-3.31457 8.92419,-24.36077 12.96435,-40.40789 4.43614,-17.61992 8.08383,-37.40934 10.50604,-56.99725 1.05232,-8.50988 2.1619,-15.72111 2.46573,-16.02495 0.64309,-0.64309 2.6928,1.66469 9.7848,11.01675 3.42759,4.51989 5.47957,6.45222 6.14506,5.78673 1.18368,-1.18368 -0.68453,-30.51729 -2.75684,-43.28638 -1.74071,-10.72592 -4.37632,-21.1576 -6.74023,-26.67774 -1.03434,-2.41534 -1.68984,-4.5823 -1.45667,-4.81547 0.23317,-0.23317 3.05697,0.90265 6.27513,2.52404 9.1322,4.60104 20.99201,7.95377 45.19529,12.77659 12.28926,2.44879 23.57308,5.08787 25.07515,5.86462 9.57196,4.94985 22.94665,28.40208 32.96941,57.8111 2.76841,8.12314 10.28609,32.19814 16.70596,53.5 6.41986,21.30186 11.88553,39.29316 12.14592,39.98066 0.37646,0.99395 -17.06674,1.25 -85.1566,1.25 H 264.48143 Z M 292.3029,319.27575 c -3.48342,-3.65128 -4.45897,-6.45791 -5.83264,-16.7804 l -1.14521,-8.60577 5.12567,-8.35825 c 7.3769,-12.02924 13.35778,-24.49549 17.52649,-36.53131 3.20476,-9.25271 4.17092,-10.95875 8.13338,-14.36186 5.35782,-4.60148 8.85325,-11.11418 11.48239,-21.39399 2.20459,-8.6199 2.40904,-13.47419 0.83135,-19.73974 -2.07703,-8.24867 -6.91023,-9.75732 -10.39679,-3.24531 -1.1,2.05452 -2.31639,3.73671 -2.70308,3.7382 -0.3867,0.001 -1.47529,-1.6246 -2.41909,-3.61352 -3.45146,-7.2734 -12.43759,-11.95743 -37.37783,-19.4832 -36.97908,-11.15851 -50.57658,-17.84965 -64.69138,-31.83371 -7.11369,-7.0478 -9.1226,-7.45885 -17.07813,-3.49444 -6.3577,3.16818 -14.21568,11.58946 -17.71356,18.98336 -3.59507,7.59935 -6.48828,19.31308 -7.21077,29.19421 -0.33177,4.5375 -0.80892,8.25 -1.06034,8.25 -0.25141,0 -1.79409,-1.125 -3.42819,-2.5 -3.73675,-3.14427 -4.36211,-3.12484 -6.54282,0.20333 -2.23258,3.40736 -2.43946,17.43846 -0.3656,24.79667 2.41169,8.55685 6.77334,16.1351 11.61665,20.18361 3.60598,3.01423 4.89833,4.96775 6.16195,9.31445 2.92343,10.05624 10.27022,26.25548 16.96068,37.3973 l 6.60969,11.0073 -0.6645,10.04867 c -0.74861,11.32069 -1.9804,16.16987 -4.42377,17.41502 -1.56622,0.79815 -24.35316,-0.0941 -35.85864,-1.40416 -6.56738,-0.74777 -11.84347,-4.46271 -17.76801,-12.51063 -12.10229,-16.43979 -15.71037,-32.44915 -13.58553,-60.28013 4.7534,-62.25964 27.2222,-120.24856 52.91047,-136.55478 2.54749,-1.61707 7.03281,-3.64203 9.96737,-4.49991 3.87995,-1.13423 6.9751,-3.07768 11.34521,-7.123635 12.46712,-11.54236 25.74733,-15.92105 46.31922,-15.27215 11.32895,0.35735 14.13371,0.80718 21.81973,3.49945 16.5524,5.798 31.67451,16.565115 46.03801,32.779585 14.3084,16.15227 22.61268,30.83521 30.69285,54.26859 16.39981,47.56123 14.10848,112.15599 -4.86138,137.04726 -4.08556,5.36086 -8.18764,6.77337 -26.3982,9.08991 -9.18994,1.16905 -17.30716,2.35507 -18.03825,2.63562 -0.7311,0.28055 -2.52093,-0.73899 -3.9774,-2.26565 z"
style="fill:#4e4e4d" />
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="m 45.319305,524.24985 50.878125,-168.64351 91.02866,-21.85078 124.81002,189.43887 15.4976,-12.33208 -130.63444,-191.36234 -9.67318,14.25555 124.81002,189.43887"
id="path275"
sodipodi:nodetypes="cccccccc" />
<path
style="fill:#ffffff;fill-opacity:1;stroke:#000000;stroke-width:3;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1"
d="M 443.88287,524.02559 393.00474,355.38208 301.97608,333.5313 177.16606,522.97017 161.66846,510.63809 292.3029,319.27575 301.97608,333.5313 177.16606,522.97017"
id="path275-6"
sodipodi:nodetypes="cccccccc" />
<path
style="fill:#fbd0a6;fill-opacity:1;stroke:none;stroke-width:1px;stroke-linecap:butt;stroke-linejoin:miter;stroke-opacity:1"
d="m 187.52213,139.10279 14.34593,25.22547 9.57434,-32.06638 13.85516,33.79118 18.44245,-38.89028 4.92331,44.11511 20.28515,-38.50102 -2.21466,39.35905 31.27764,-28.90273 -5.47875,45.83312 23.27252,-10.25342 -8.67174,30.59353 c 24.86464,-33.77835 23.21015,12.27629 3.94365,35.3922 l -12.95127,26.98572 -12.80079,22.10524 -26.61623,18.28625 -53.44338,-20.79546 c -21.13665,-20.42844 -23.443,-25.48798 -31.95313,-51.61993 -19.36867,-32.18928 -17.20493,-59.66994 4.27858,-38.00437 l -2.30548,-27.96686 11.07502,10.22035 -14.60569,-33.15484 22.1057,18.70679 z"
id="path9531"
sodipodi:nodetypes="cccccccccccccccccccccccc" />
</svg>

Before

Width:  |  Height:  |  Size: 4.6 KiB

After

Width:  |  Height:  |  Size: 4.0 KiB

View File

@ -4,12 +4,17 @@
// The list of which env maps to which file can be found in `.angular-cli.json`.
export const environment = {
production: true,
production: false,
// URL of development API
apiUrl: 'http://192.168.1.156/karideo/api',
apiOAuthUrl: 'http://192.168.1.156/karauth/api',
frontBaseUrl: 'karideo',
apiMode: 'QUERRY',
// apiMode: "REWRITE",
localBdd: true
applName: "karideo",
defaultServer: "karideo",
server: {
karideo: 'http://192.168.1.156/karideo/api',
karauth: 'http://192.168.1.156/karauth/api',
},
ssoSignIn: 'http://192.168.1.156/karso/signin/karideo/',
ssoSignUp: 'http://192.168.1.156/karso/signup/karideo/',
ssoSignOut: 'http://192.168.1.156/karso/signout/karideo/',
frontBaseUrl: '',
apiMode: 'REWRITE'
};

View File

@ -6,12 +6,31 @@
export const environment = {
production: false,
// URL of development API
// apiUrl: 'http://localhost:15080',
// apiUrl: 'http://localhost:18080/karideo/api',
apiUrl: 'http://192.168.1.156/karideo/api',
// apiOAuthUrl: 'http://localhost:17080/karauth/api',
apiOAuthUrl: 'http://192.168.1.156/karauth/api',
applName: "karideo",
defaultServer: "karideo",
server: {
karideo: 'http://localhost:18080/karideo/api',
karauth: 'http://192.168.1.156/karauth/api',
},
ssoSignIn: 'http://192.168.1.156/karso/signin/karideo-dev/',
ssoSignUp: 'http://192.168.1.156/karso/signup/karideo-dev/',
ssoSignOut: 'http://192.168.1.156/karso/signout/karideo-dev/',
frontBaseUrl: '',
apiMode: 'REWRITE'
};
export const environment_kjlkjlkjlkj = {
production: false,
// URL of development API
applName: "karideo",
defaultServer: "karideo",
server: {
karideo: 'http://192.168.1.156/karideo/api',
karauth: 'http://192.168.1.156/karauth/api',
},
ssoSignIn: 'http://localhost:4200/signin/karideo-dev/',
ssoSignUp: 'http://localhost:4200/signup/karideo-dev/',
ssoSignOut: 'http://localhost:4200/signout/karideo-dev/',
frontBaseUrl: '',
// apiMode: "QUERRY"
apiMode: 'REWRITE'
};

View File

@ -22,10 +22,6 @@
<!-- Some tools -->
<script src="assets/js_3rd_party/dateFormat.min.js"></script>
<script src="assets/js_3rd_party/sha512.js"></script>
<!-- common link with the cloud -->
<script src="assets/aaa_interfaceCloud.js"></script>
</head>
<body>
<div class="full-back"> </div>

View File

@ -9,12 +9,12 @@
"moduleResolution": "node",
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"target": "es2015",
"target": "es2018",
"typeRoots": [
"node_modules/@types"
],
"lib": [
"es2017",
"es2018",
"dom"
],
"module": "es2020",