diff src/nabble/view/web/template/SubscriptionNamespace.java @ 0:7ecd1a4ef557

add content
author Franklin Schmidt <fschmidt@gmail.com>
date Thu, 21 Mar 2019 19:15:52 -0600
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/src/nabble/view/web/template/SubscriptionNamespace.java	Thu Mar 21 19:15:52 2019 -0600
@@ -0,0 +1,191 @@
+package nabble.view.web.template;
+
+import fschmidt.util.java.Base64;
+import fschmidt.util.mail.MailAddress;
+import nabble.model.ModelException;
+import nabble.model.ModelHome;
+import nabble.model.Node;
+import nabble.model.Site;
+import nabble.model.Subscription;
+import nabble.model.User;
+import nabble.naml.compiler.Command;
+import nabble.naml.compiler.CommandSpec;
+import nabble.naml.compiler.IPrintWriter;
+import nabble.naml.compiler.Interpreter;
+import nabble.naml.compiler.Namespace;
+import nabble.naml.compiler.ScopedInterpreter;
+import nabble.naml.namespaces.ListSequence;
+import nabble.naml.namespaces.TemplateException;
+import nabble.view.lib.Jtp;
+
+import java.util.List;
+import javax.servlet.http.HttpServletRequest;
+
+
+@Namespace (
+	name = "subscription",
+	global = false
+)
+public final class SubscriptionNamespace {
+	private Node node;
+	private User user;
+	private Subscription subscription;
+	private final Site site;
+
+	public SubscriptionNamespace(Node node, User user) {
+		this.node = node;
+		this.user = user;
+		this.subscription = user.getSubscription(node);
+		this.site = node.getSite();
+	}
+
+	public SubscriptionNamespace(Subscription subscription) {
+		this.node = subscription.getNode();
+		this.user = subscription.getSubscriber();
+		this.subscription = subscription;
+		this.site = node.getSite();
+	}
+
+	public SubscriptionNamespace(String code, HttpServletRequest request)
+		throws TemplateException
+	{
+		this.site = Jtp.getSite(request);
+		Object[] emailAndNode = getValuesFromCode(code, site);
+		this.user = site.getUserFromEmail((String) emailAndNode[0]);
+		this.node = (Node) emailAndNode[1];
+		this.subscription = user.getSubscription(node);
+	}
+
+	public static final CommandSpec this_subscription = CommandSpec.DO;
+
+	@Command public void this_subscription(IPrintWriter out, ScopedInterpreter<SubscriptionNamespace> interp) {
+		out.print( interp.getArg(this,"do") );
+	}
+
+    @Command public void is_subscribed(IPrintWriter out, Interpreter interp) {
+		out.print( subscription != null );
+	}
+
+	public static final CommandSpec _node = CommandSpec.DO;
+
+	@Command("node") public void _node(IPrintWriter out,ScopedInterpreter<NodeNamespace> interp) {
+		NodeNamespace nodeNs = new NodeNamespace(node);
+		out.print( interp.getArg(nodeNs,"do") );
+	}
+
+	public static final CommandSpec _user = CommandSpec.DO;
+
+	@Command("user") public void _user(IPrintWriter out,ScopedInterpreter<UserNamespace> interp) {
+		UserNamespace visitorModel = new UserNamespace(user);
+		out.print( interp.getArg(visitorModel,"do") );
+	}
+
+	@Command public void to(IPrintWriter out, Interpreter interp) {
+		out.print( subscription.getTo() );
+	}
+
+    @Command public void type(IPrintWriter out, Interpreter interp) {
+		out.print( subscription.getType() );
+	}
+
+	public static final CommandSpec save = new CommandSpec.Builder()
+		.parameters("to","type")
+		.build()
+	;
+
+    @Command public void save(IPrintWriter out, Interpreter interp) {
+		String toS = interp.getArgString("to");
+		Subscription.To to = toS==null ? Subscription.To.DESCENDANTS : Subscription.To.valueOf(toS);
+		Subscription.Type type =
+			node.getKind() == Node.Kind.APP?
+			Subscription.Type.valueOf(interp.getArgString("type")) :
+			Subscription.Type.INSTANT;
+
+		if (subscription == null) {
+			subscription = user.subscribe(node, to, type);
+		} else {
+			subscription.setTo(to);
+			subscription.setType(type);
+		}
+	}
+
+    @Command public void remove(IPrintWriter out, Interpreter interp) {
+		subscription.delete();
+	}
+
+	private static final String SALT = "zDf3s";
+
+	@Command public void subscription_code(IPrintWriter out, Interpreter interp) {
+		String email = user.getEmail();	
+		out.print( getCode(email, node) );
+	}
+
+	public static String getCode(String email, Node node) {
+		int key = (email + SALT).hashCode();
+		String params = email + '|' + node.getId() + '|' + key;
+		return Base64.encode(params.getBytes());
+	}
+
+	private static Object[] getValuesFromCode(String code, Site site) throws TemplateException {
+		String[] values = decodeParams(code);
+		if (values == null)
+			values = decodeParams(code+"=="); // try with "==" at the end (most common problem with invalid codes)
+		if (values == null)
+			throw ModelException.newInstance("invalid_link");
+
+		long nodeId = Long.valueOf(values[1]);
+		Node node = site.getNode(nodeId);
+		if (node == null || !node.getSite().equals(site))
+			throw ModelException.newInstance("invalid_link");
+		return new Object[] { values[0], node };
+	}
+
+	private static String[] decodeParams(String code) {
+		String params;
+		try {
+			params = new String(Base64.decode(code));
+		} catch (Base64.InvalidCharEncodedStringException e) {
+			return null;
+		}
+		if (params.indexOf('|') == -1)
+			return null;
+		String[] values = params.split("\\|");
+		if (!new MailAddress(values[0]).isValid())
+			return null;
+		try {
+			Long.valueOf(values[1]);
+		} catch (NumberFormatException e) {
+			return null;
+		}
+		String key = (values[0] + SALT).hashCode() + "";
+		if (!key.equals(values[2]))
+			return null;
+
+		return values;
+	}
+
+
+
+	@Namespace (
+		name = "subscription_list",
+		global = true
+	)
+	public static final class SubscriptionList extends ListSequence<Subscription> {
+		private SubscriptionNamespace ns = null;
+
+		public SubscriptionList(List<Subscription> subscriptions) {
+			super(subscriptions);
+		}
+
+		public static final CommandSpec current_subscription = CommandSpec.DO;
+
+		@Command public void current_subscription(IPrintWriter out,ScopedInterpreter<SubscriptionNamespace> interp) {
+			Subscription subscription = get();
+			if( ns==null || ns.subscription != subscription )
+				ns = new SubscriptionNamespace(subscription);
+			out.print( interp.getArg(ns,"do") );
+		}
+
+	}
+
+}